尝试使用performSegue(withIdentifier:,sender :)时应用程序崩溃

时间:2017-09-05 09:05:30

标签: ios swift

如果我的应用程序是通过Firebase发送的通知打开的,我目前正在尝试立即执行一个新的ViewController。

我尝试使用代码self.performSegue(withIdentifier: "testSegue", sender: nil)执行segue,其中" testSegue"是我的Storyboard中从ViewController到SecondViewController(不同类)的segue的标识符。

问题是这一行崩溃了我的应用程序,由于我从通知中启动应用程序而不是从Xcode启动应用程序,因此我无法轻松调试。

我还通过在5秒后添加运行此行的Timer来延迟代码,以确定崩溃发生时它位于此行,并且还尝试使用present(viewControllerToPresent: ...)

如果有人能指出崩溃发生的原因,或者在这种情况下如何调试错误,或者任何其他方法让我自动进行ViewController,那就太棒了,谢谢。

AppDelegate.swift中的一些额外代码:

func application(_ application: UIApplication, didReceiveRemoteNotification userInfo: [AnyHashable: Any],
                 fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {

    print(userInfo)

    let url = userInfo["url"]

    print("url is: \(String(describing: url))")

    if url != nil {

        vc.defaults.set("\(String(describing: url))", forKey: "urlDef")

        vc.defaults.set(true, forKey: "hasRun")

        initialVC.testingFunc()

        print("Func done")

    }

    completionHandler(UIBackgroundFetchResult.newData)

    print("Func finished")
}

ViewController.swift中的一些其他代码

var funcTimer = Timer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

}

func testingFunc() {

    funcTimer = Timer.scheduledTimer(timeInterval: 5, target: self, selector: #selector(self.triggerSegue), userInfo: nil, repeats: false)
    print("The timer has begun")

}

func triggerSegue() {

    print("Trigger segue func has begun")
    self.performSegue(withIdentifier: "testSegue", sender: nil)

}

My segue in the Storyboard

1 个答案:

答案 0 :(得分:4)

在展示viewController时切换到主线程。

func triggerSegue() {
    DispatchQueue.main.async {
        self.performSegue(withIdentifier: "testSegue", sender: nil)
    }
}