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 两次都为零?