2017-09-05 3 views
2

Ich versuche gerade, einen Übergang zu einem neuen ViewController sofort durchzuführen, wenn meine App über eine von Firebase gesendete Benachrichtigung geöffnet wird.App stürzt beim Versuch ab, performSegue zu verwenden (withIdentifier:, sender:)

Ich versuche, das Segment mit dem Code self.performSegue(withIdentifier: "testSegue", sender: nil) durchzuführen, wobei "testSegue" der Bezeichner eines Segments in meinem Storyboard vom ViewController zum SecondViewController (andere Klasse) ist.

Das Problem ist, dass diese Zeile meine App abstürzt, und ich kann nicht leicht debuggen dies aufgrund der Tatsache, dass ich die App aus der Benachrichtigung starten, und nicht von Xcode.

Ich habe auch den Code verzögert, indem ich einen Timer hinzugefügt habe, der diese Zeile 5 Sekunden später ausführt, um zu bestimmen, dass es sich um diese Zeile handelt, wenn der Absturz auftritt, und habe auch versucht, present(viewControllerToPresent: ...) zu verwenden.

Wenn jemand darauf hinweisen könnte, warum der Absturz auftritt, oder wie der Fehler in dieser Situation zu debuggen ist, oder irgendwelche anderen Möglichkeiten, um den ViewController zu benutzen, den ich automatisch brauche, wäre das großartig, danke.

Einige weitere Code von 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") 
} 

Einige weitere Code von 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

was ist Ihr Crashlog – Govaadiyo

+0

ich ein nicht haben, aufgrund der Tatsache, dass ich nicht bin die App von Xcode läuft, wie ich es von der –

+1

Benachrichtigung gestartet bin ist es eine wilde Vermutung, ohne dass die crash log, aber das erste, was ich tun würde, ist zu überprüfen, ob Sie auf dem Hauptthread sind .. versuchen, diesen Präsentationscode auf den Hauptthread zu setzen. –

Antwort

4

Umschalten auf Hauptthread, wenn Sie die Viewcontroller präsentieren.

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