2017-02-01 2 views
1

Ich habe einen ViewController, um die Authentifizierung des Benutzers bei einer oAuth-API zu behandeln. Wenn es eine gespeicherte Token in user.defaults ist dieser Block läuftperformSegue (withIdentifier) ​​schlägt in einer Instanz von viewController fehl

FRDStravaClient.sharedInstance().fetchCurrentAthlete(success: { (StravaAthlete) -> Void in 
    self.performSegue(withIdentifier: "AuthorizeSuccessfulSegue", sender: StravaAthlete.self) 
}, failure: { (Error) in 
    //some failure stuff 
}) 

Die Segue ausgelöst wird und der Benutzer bewegt sich auf den Rest der App auf.

Wenn jedoch der Benutzer anmelden muss, wenn sie an die App zurück, nachdem sie diesen Block läuft zur Ermächtigung:

FRDStravaClient.sharedInstance().exchangeToken(forCode: code, 
success: { (response: StravaAccessTokenResponse?) in 
    self.performSegue(withIdentifier: "AuthorizeSuccessfulSegue", sender: response?.athlete) 
}, failure:{ (error) -> Void in 
    self.showAuthFailedWithError(error: (error?.localizedDescription)!) 
    print(error!) 
}) 

, die die App mit dem Fehler abstürzt: ‚Receiver() hat keine segue mit identifier 'AuthorizeSuccessfulSegue' '

Beide Erfolgsblöcke verwenden denselben Bezeichner, der in Interface Builder korrekt festgelegt wurde. Selbst referenziert AuthViewController. Warum arbeitet einer und der andere stürzt ab?

+2

Haben Sie versucht, nur den Absender "Selbst" zu machen? Auch wenn das eine asynchrone Anfrage ist, sollten Sie das Segment in einem Dispatch-Block wie 'DispatchQueue.main.async {self.performSegue ...}' – Pierce

+0

ausführen Das sieht Okay für mich aus. Sind Sie sicher, dass diese beiden Blöcke im selben View-Controller sind? –

+0

@Pierce Ich habe verschiedene Varianten des Senders ausprobiert und die 'DispatchQueue.main.async' vor dem Posten eingefügt, aber es hat nichts geändert (und ich habe es auch noch einmal versucht). Beide sind Async-Funktionen. – Colin

Antwort

0

Das Problem war, dass die erste Funktion in viewDidLoad passiert, während die zweite in einer Funktion der VC geschieht, die von appDelegate aufgerufen wird, wenn Sie von Safari zurückkehren und die App autorisieren. Ich habe einen neuen AutViewController instanziiert, anstatt die aktuelle Instanz zu erhalten.

Verwandte Themen