Ich erstelle eine App, die das Facebook SDK zur Authentifizierung von Benutzern verwendet. Ich versuche, die Facebook-Logik in einer separaten Klasse zu konsolidieren. Hier ist der Code (der Einfachheit halber entfernt):
import Foundation
class FBManager {
class func fbSessionStateChane(fbSession:FBSession!, fbSessionState:FBSessionState, error:NSError?){
//... handling all session states
FBRequestConnection.startForMeWithCompletionHandler { (conn: FBRequestConnection!, result: AnyObject!, error: NSError!) -> Void in
println("Logged in user: \n\(result)");
let storyboard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
let loggedInView: UserViewController = storyboard.instantiateViewControllerWithIdentifier("loggedInView") as UserViewController
loggedInView.result = result;
//todo: segue to the next view???
}
}
}
Ich verwende die obige Klassenmethode, um Änderungen des Sitzungsstatus zu überprüfen, und sie funktioniert einwandfrei.
F: Wie kann ich, sobald ich die Daten des Benutzers habe, innerhalb dieser benutzerdefinierten Klasse zur nächsten Ansicht übergehen?
BEARBEITEN: Um ganz klar zu sein, ich habe einen Segue mit einer Kennung im Storyboard und ich versuche einen Weg zu finden, einen Segue von einer Klasse durchzuführen, die nicht der View Controller ist
performSegue:
?Antworten:
Wenn Ihr Segue im Storyboard mit einer Segue-ID zwischen Ihren beiden Ansichten vorhanden ist, können Sie ihn einfach programmgesteuert aufrufen, indem Sie:
Für ältere Versionen:
Sie könnten auch tun:
Oder wenn Sie sich in einem Navigationscontroller befinden:
quelle
Sie können NSNotification verwenden
Fügen Sie Ihrer benutzerdefinierten Klasse eine Post-Methode hinzu:
Fügen Sie Ihrem ViewController einen Beobachter hinzu:
Funktion in ViewController hinzufügen:
quelle
Wenn Ihr Segue im Storyboard mit einer Segue-ID zwischen Ihren beiden Ansichten vorhanden ist, können Sie ihn einfach programmgesteuert aufrufen
Wenn Sie sich in der Navigationssteuerung befinden
Ich werde Sie für den zweiten Ansatz mit Navigations-Controller empfehlen.
quelle
Sie können Segue wie folgt verwenden:
quelle
Swift 3 - Funktioniert auch mit SpriteKit
Sie können NSNotification verwenden .
Beispiel:
1.) Erstellen Sie einen Segue im Storyboard und nennen Sie die Kennung "Segue".
2.) Erstellen Sie eine Funktion in dem ViewController, von dem Sie wechseln.
3.) In ViewDidLoad () Ihres ViewControllers wechseln Sie vom Erstellen des Beobachters.
Update - Als ich dies das letzte Mal verwendet habe, musste ich den
.addObserver
Aufruf auf den folgenden Code ändern , um die Fehler auszuschalten.4.) Fügen Sie in dem ViewController oder der Szene, zu der Sie wechseln, die Post-Methode hinzu, wo immer Sie den Übergang auslösen möchten.
Update - Als ich dies das letzte Mal verwendet habe, musste ich den
.post
Aufruf auf den folgenden Code ändern , um die Fehler auszuschalten.quelle
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
Was Sie tun möchten, ist für Unit-Tests wirklich wichtig. Grundsätzlich müssen Sie eine kleine lokale Funktion im View Controller erstellen. Nennen Sie die Funktion etwas, fügen Sie einfach die
performSegueWithIndentifier
.Ändern Sie als Nächstes Ihre Utility-Klasse so
FBManager
, dass sie einen Initialisierer enthält, der ein Argument einer Funktion und eine Variable enthält, die die ViewController-Funktion enthält, die den Übergang ausführt.(Mit dem Convenience-Init können Sie dies für Unit-Tests verwenden, ohne den Übergang auszuführen.)
Schließlich, wo Sie // todo: zur nächsten Ansicht übergehen ???, setzen Sie etwas in der Art von:
In Ihren Unit-Tests können Sie es einfach wie folgt aufrufen:
Dabei ist doThatThing Ihr fbsessionstatechange und
UtilClass
FBManager.localFunc
Übergeben Sie für Ihren eigentlichen Code einfach (keine Klammern) an die FBManager-Klasse.quelle
Das hat bei mir funktioniert.
Geben Sie dem View Controller in Ihrem Storyboard zunächst eine Storyboard-ID im Identitätsinspektor. Verwenden Sie dann den folgenden Beispielcode (stellen Sie sicher, dass Klasse, Storyboard-Name und Storyboard-ID mit den von Ihnen verwendeten übereinstimmen):
Weitere Details finden Sie http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html besten Wünsche
quelle
Sie können dies mit der
performSegueWithIdentifier
Funktion tun .Syntax :
Beispiel:
quelle
Eine andere Möglichkeit ist die Verwendung von Modal Segue
SCHRITT 1: Gehen Sie zum Storyboard und geben Sie dem View Controller eine Storyboard-ID . Wo Sie die Storyboard-ID ändern können, finden Sie rechts im Identitätsinspektor. Rufen wir die Storyboard-ID auf
ModalViewController
SCHRITT 2: Öffnen Sie den View Controller für den Absender (nennen wir ihn
ViewController
) und fügen Sie diesen Code hinzuBeachten Sie, dass der View Controller, den wir öffnen möchten, auch aufgerufen wird
ModalViewController
SCHRITT 3: Um ModalViewController zu schließen, fügen Sie dies hinzu
quelle
Das hat bei mir funktioniert:
quelle