2017-09-05 17 views
2

Firebaseから送信された通知で自分のアプリケーションが開かれている場合、現在新しいViewControllerにsegueを実行しようとしています。performSegue(withIdentifier:、送信者:)を使用しようとするとクラッシュするアプリケーション

私はコードself.performSegue(withIdentifier: "testSegue", sender: nil)でSegueを実行しようとしています。ここで、 "testSegue"は、私のストーリーボードのViewControllerからSecondViewController(別のクラス)に行くsegueの識別子です。

問題は、この行が私のアプリケーションをクラッシュさせていることです。私はXcodeからではなく通知からアプリを起動しているため、簡単にデバッグできません。

また、この行を5秒後に実行するタイマーを追加してコードを遅延させ、クラッシュが発生したときにこの行にあることを確認し、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

+0

私は通知 – Govaadiyo

+0

である私はそれをせずに野生の推測ですが、原因私はXcodeのからアプリケーションを実行していないという事実のために、1を持っていませんクラッシュログが、私はまずあなたがメインスレッドにいるかどうかをチェックすることです..メインスレッドにそのプレゼンテーションコードを入れてみてください.. –

+1

からそれを起動していて、あなたのクラッシュログ –

答えて

4

スイッチあなたはViewControllerをを提示しています。

func triggerSegue() { 
    DispatchQueue.main.async { 
     self.performSegue(withIdentifier: "testSegue", sender: nil) 
    } 
} 
関連する問題