2017-10-27 2 views
1

Auf meiner App habe ich einen Splash-Screen, der prüft, ob ein Benutzer bereits bei Facebook eingeloggt ist. Ist dies nicht der Fall, wird der Anmeldebildschirm vom Begrüßungsbildschirm an den Navigationsstapel gesendet. Wenn der Benutzer angemeldet ist, verschiebt der Begrüßungsbildschirm auch den Anmeldebildschirm, ruft jedoch in viewDidAppear des Anmeldebildschirms eine Methode auf, die den Hauptbildschirm der Anwendung verschiebt.performSegue funktioniert nicht seit Update auf Xcode 9 (und iOS 11)

Also, wenn der Benutzer in I angemeldet ist, sollte folgende Ansicht-Controller auf meinem app Stack sehen:

SplashViewController > LoginViewController > MainViewController.

Diese Strömung ohne Probleme auf iOS gearbeitet 9 und iOS 10.

jedoch Seit ich auf iOS 11 aufgerüstet habe, funktioniert dieser Fluss nicht mehr.

Jetzt, wenn der Benutzer angemeldet ist, erscheint der Hauptansicht-Controller nicht, nur der Login-View-Controller bleibt sichtbar. Ich überprüfte den Debugger, der in der Tat ausgeführt wird.

Es gibt zwei seltsame Details. Der erste ist, dass die Buttons auf diesem Login-View-Controller nicht mehr funktionieren (es gibt eine Schaltfläche, die den Facebook-Login-Flow vom FacebookLogin-SDK aufruft).

Die zweite ist, dass, wenn ich zu Xcode gehen und auf die Schaltfläche "Debughierarchie anzeigen" klicken, während Xcode die Ansichtshierarchie verarbeitet und erstellt, plötzlich der Hauptansicht-Controller in meiner App erscheint.

Es scheint, dass der Hauptansicht-Controller gedrückt wird, aber seine Ansicht wird nicht angezeigt; Daher funktionieren die Segmente auf dem LoginViewController nicht mehr. Wenn Sie jedoch auf "Debug View Hierarchy" klicken, scheint etwas ausgelöst zu werden, das die Ansichtshierarchie aktualisiert.

Ich arbeite mit Xcode 9.0.1. Dieses Problem tritt sowohl bei den Xcode-Simulatoren als auch bei meinem iPad Mini 2 auf, auf dem derzeit iOS 11.0.3 läuft.

Danke.

+0

erscheinen ich das gleiche Problem haben, aber ich bin mit KYDrawerController. Wenn ich den KYDrawerController entferne, dann funktioniert es gut (abgesehen davon, dass ich mein Menü verliere). – jackofallcode

Antwort

1

Ich weiß nicht genau, warum das passierte, aber ich konnte dieses Problem auf folgende Weise lösen.

Auf der SplashViewController, wobei I die direkten segue auf den Login-View-Controller genannt wird, die ein andere segue auf der viewWillAppear() Methode aufrufen würde, gezwungen ich die segue auf der Hauptwarteschlange durchgeführt werden:

// SplashViewController 
struct Identifier { 
    static let login = "Login" 
    static let direct = "Direct" 
} 

override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    login() 
} 

func login() { 
    // If there already exists a Facebook token we try to login directly. 
    if let accessToken = AccessToken.current { 
     bm.login(facebookToken: accessToken.authenticationToken, completion: { (error, user) in 
      guard error == nil else { 
       self.performSegue(withIdentifier: Identifier.login, sender: self) 
       return 
      } 
      // This call on the main queue wasn't needed on iOS 10 
      DispatchQueue.main.async { 
       self.performSegue(withIdentifier: Identifier.direct, sender: self) 
      } 
     }) 
    } else { 
     performSegue(withIdentifier: Identifier.login, sender: self) 
    } 
} 

dann auf LoginViewController:

// LoginViewController 
override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 
    if direct { 
     // Without calling the previous segue on the main queue this 
     // segue would be called but the pushed view controller's 
     // view would not appear on the screen until a refresh event 
     // was triggered. 
     self.performSegue(withIdentifier: Identifier.direct, sender: nil) 
    } 
} 
+0

Danke Felipe, du hast mein Leben gerettet !, Ich habe keine Dokumentation zu diesem Problem gefunden, aber ich hatte genau dieses Problem auf ios 11. Das sollte irgendwo dokumentiert werden. – PedroHidalgo

Verwandte Themen