2017-04-03 5 views
0

ユーザーがまだアプリケーションをセットアップしていない場合、アプリケーションを最初に起動するときにブロックを実行しようとしています。現在、コードは、アプリケーションがセットアップされているかどうかを確認するために、別のメソッド(クリーン)のために格納されたUserDefaultsをチェックします。しかし、この場合は重要ではありません。アプリケーションをまだセットアップしていないと思うようにソフトウェアをハードコーディングしたからです。私はその後、ViewControllerのviewDidAppear関数内で(ハードコードを参照して)設定されているかどうかを確認するアプリケーションをチェックします。それがセットアップされていないことがわかると、SetupViewControllerにセグを要求するメソッドを呼び出します。しかし何らかの理由で、セグーを2回呼びます。だから一度segueが実行され、私は他のビューを参照してください、それはもう一度それを試して実行するように見えるし、例外をスローします。以下は私のコードと私のログの出力です。私のコードの何が間違っているのですか、私のコードのロジックに何が欠けていますか?また、SegueがMain.storyboardに適切な識別子を持っていることを確認して確認しました。事前にみんなありがとう!Segueが2回呼び出されていて、理由がわかりません - Swift

ViewDidAppearコード:

/* 
RunSetup - Runs the setup for the application environment. 
*/ 
func runSetup() 
{ 
    print("Running setup for AppName") // Notify the log that you are running the App's setup. 

    // ## Start by clearing all possibly stored data. ## 

    //REALM - Destroy Database if it exists 

    try! realm.write { 
     realm.deleteAll() 
    } 

    //Begin setting up the environment 
    self.performSegue(withIdentifier: "dismissAndCreate", sender: self) 
    print("tryingSegue") 

} 

ログ出力: "RunSetup":と呼ばれるセグエを呼びかけ

/* 
ViewDidAppear - If the view has appeared after loading we will run some code to check the state of the app. 
*/ 
override func viewDidAppear(_ animated: Bool) { 
    // If the application hasn't been setup and it believes it isn't setup run setup. 
    if(checkIfSetup() != true && hasSetup == false) 
    { 
     print("attempted run") 
     runSetup() 
    } 
     // If the application has been setup and believes it has been setup, load view. 
    else if(checkIfSetup() == true && hasSetup == true) 
    { 
     loadApp() 
    } 
} 

方法

attempted run Running setup for AppName tryingSegue attempted run Running setup for AppName 2017-04-03 17:12:57.404 AppName[22109:3226052] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Receiver (<AppName.SetupAppViewController: 0x7ffc97824400>) has no segue with identifier 'dismissAndCreate'' *First Throw Stack is then listed*

答えて

1

ソリューションは非常に簡単な方法で来ました。 SetupViewControllerでviewDidAppearまたはviewDidLoad関数を作成するのを忘れていました。これは問題を解決しました。

+1

また、上書きするメソッド内でsuperを呼び出すことも忘れないでください。 'super.viewDidAppear(animated)'はあなたのviewDidAppear()メソッドの中の最初のものであるべきですが、上記のコードでは表示されません。 Appleのドキュメントごとに:「このメソッドをオーバーライドする場合は、実装のある時点でsuperを呼び出す必要があります。 –

+0

ただし、私がsuper.viewDidAppear(アニメーション)を呼び出すと、それは以前の問題になります。これは、以前のView Controllerをスーパーとして扱っているかのようです。 – surfmaster96

関連する問題