Segue 被叫了两次,我不知道为啥 - 斯威夫特

Posted

技术标签:

【中文标题】Segue 被叫了两次,我不知道为啥 - 斯威夫特【英文标题】:Segue is being called twice and I'm not sure why - SwiftSegue 被叫了两次,我不知道为什么 - 斯威夫特 【发布时间】:2017-04-03 22:39:08 【问题描述】:

如果用户尚未设置应用程序,我将尝试在应用程序首次启动时运行一段代码。目前,代码通过另一种方法(为了清洁)检查存储的 UserDefaults 以查看应用程序是否已设置。但是,在这种情况下,这无关紧要,因为我对软件进行了硬编码以认为应用程序尚未设置。然后我让应用程序检查它是否已在 ViewController 的 viewDidAppear 函数中设置(引用硬代码)。在看到它还没有设置后,它会调用一个方法来要求与 SetupViewController 进行连接。但由于某种原因,它调用了 segue 两次。因此,一旦执行 segue 并且我看到另一个视图,它似乎会尝试再次运行它,然后抛出异常。下面是我的代码和我的日志输出。我的代码中有什么不正确,或者我的代码逻辑中缺少什么?我还检查并确保 segue 在 Main.storyboard 中有正确的标识符。提前谢谢各位!

ViewDidAppear 代码:

/*
 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()
    

调用segue的方法称为“RunSetup:”

/*
 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")


日志输出:

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 函数。这样就解决了问题。

【讨论】:

另外,不要忘记在你覆盖的方法中调用 super,例如super.viewDidAppear(animated) 应该是您的 viewDidAppear() 方法中的第一件事,但我在上面的代码中没有看到它。根据 Apple 的文档:“如果您覆盖此方法,则必须在实现中的某个时刻调用 super。” 奇怪的是,当我调用 super.viewDidAppear(animated) 时,它会遇到上一个问题。就好像它把以前的视图控制器当作它的超级控制器一样。

以上是关于Segue 被叫了两次,我不知道为啥 - 斯威夫特的主要内容,如果未能解决你的问题,请参考以下文章

didUpdateToLocation 调用了两次,好的。为啥 oldLocation 两次都为零?

Express:为啥这个 GET 请求执行了两次?

为啥我的对象似乎被创建了两次?

在 JSF 中,“saveState()”方法被调用了两次。为啥?

为啥构造 std::thread 时参数移动了两次

为啥我的 UIViewController 被加载了两次? IOS 7