Ich erstelle eine App, die das Facebook SDK verwendet, um Benutzer zu authentifizieren. Ich versuche, die Facebook-Logik in einer separaten Klasse zu konsolidieren. Hier ist der Code (der Einfachheit halber gestrippt):
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 oben genannte Klassenmethode, um Änderungen des Sitzungsstatus zu überprüfen, und sie funktioniert einwandfrei.
F: Wie kann ich innerhalb dieser benutzerdefinierten Klasse zur nächsten Ansicht wechseln, wenn ich die Daten des Benutzers habe?
EDIT: Um es klar zu machen: Ich habe einen Abschnitt mit einem Bezeichner im Storyboard und ich versuche, einen Weg zu finden, um einen Abschnitt von einer Klasse auszuführen, die nicht der Ansichts-Controller ist
Wenn Ihre Überblendung im Storyboard mit einer Überblendungskennung zwischen Ihren beiden Ansichten vorhanden ist, können Sie sie einfach programmgesteuert aufrufen:
performSegue(withIdentifier: "mySegueID", sender: nil)
Für ältere Versionen:
performSegueWithIdentifier("mySegueID", sender: nil)
Sie könnten auch tun:
presentViewController(nextViewController, animated: true, completion: nil)
Oder wenn Sie sich in einem Navigationscontroller befinden:
self.navigationController?.pushViewController(nextViewController, animated: true)
Sie können NSNotification verwenden
Fügen Sie in Ihrer benutzerdefinierten Klasse eine Post-Methode hinzu:
NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)
Fügen Sie einen Beobachter in Ihren ViewController ein:
NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)
Funktion in Ihrem ViewController hinzufügen:
func methodOFReceivedNotication(notification: NSNotification){
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
}
Wenn Ihre Überblendung im Storyboard mit einer Überblendungskennung zwischen Ihren beiden Ansichten vorhanden ist, können Sie sie einfach programmgesteuert mit aufrufen
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
Wenn Sie sich im Navigations-Controller befinden
let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
Ich werde Sie für den zweiten Ansatz mit Navigations-Controller empfehlen.
Sie können segue folgendermaßen verwenden:
self.performSegueWithIdentifier("Push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
if segue.identifier == "Push" {
}
}
Swift - Funktioniert auch mit SpriteKit
Sie können NSNotification verwenden.
Beispiel:
1.) Erstelle einen Abschnitt im Storyboard und benenne den Bezeichner "segue"
2.) Erstellen Sie eine Funktion in dem ViewController, von dem Sie abweichen.
func goToDifferentView() {
self.performSegue(withIdentifier: "segue", sender: self)
}
3.) In ViewDidLoad () Ihres ViewControllers trennen Sie sich von der Erstellung des Beobachters.
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)
pdate - Als ich dies das letzte Mal verwendete, musste ich den .addObserver
-Aufruf auf den folgenden Code ändern, um die Fehler zu beseitigen.
NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)
4.) Fügen Sie im ViewController oder in der Szene, zu der Sie übergehen, die Post-Methode hinzu, wo immer Sie möchten, dass die Übergabe ausgelöst wird.
NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)
pdate - Als ich dies das letzte Mal verwendete, musste ich den .post
-Aufruf auf den folgenden Code ändern, um die Fehler zu beseitigen.
NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)
Was Sie tun möchten, ist für Unit-Tests wirklich wichtig. Grundsätzlich müssen Sie im View-Controller eine kleine lokale Funktion erstellen. Nennen Sie die Funktion beliebig, schließen Sie einfach das performSegueWithIndentifier
ein.
func localFunc() {
println("we asked you to do it")
performSegueWithIdentifier("doIt", sender: self)
}
Ändern Sie als Nächstes Ihre Dienstprogrammklasse FBManager
, um einen Initialisierer einzuschließen, der ein Argument einer Funktion und eine Variable zur Aufnahme der ViewController-Funktion, die den Segue ausführt, akzeptiert.
public class UtilClass {
var yourFunction : () -> ()
init (someFunction: () -> ()) {
self.yourFunction = someFunction
println("initialized UtilClass")
}
public convenience init() {
func dummyLog () -> () {
println("no action passed")
}
self.init(dummyLog)
}
public func doThatThing() -> () {
// the facebook login function
println("now execute passed function")
self.yourFunction()
println("did that thing")
}
}
(Mit dem Convenience-Init können Sie dies in Unit-Tests verwenden, ohne den Segue auszuführen.)
Schließlich, wo Sie // todo: zur nächsten Ansicht wechseln müssen ???, setzen Sie etwas in die Richtung von:
self.yourFunction()
In Ihren Unit-Tests können Sie es einfach aufrufen als:
let f = UtilClass()
f.doThatThing()
dabei ist doThatThing Ihr Statuswechsel und UtilClass
ist FBManager.
Übergeben Sie für Ihren tatsächlichen Code einfach localFunc
(keine Klammer) an die FBManager-Klasse.
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 die Klasse, der Name des Storyboards und die ID des Storyboards mit denen übereinstimmen, die Sie verwenden):
let viewController:
UIViewController = UIStoryboard(
name: "Main", bundle: nil
).instantiateViewControllerWithIdentifier("ViewController") as UIViewController
// .instantiatViewControllerWithIdentifier() returns AnyObject!
// this must be downcast to utilize it
self.presentViewController(viewController, animated: false, completion: nil)
Weitere Informationen finden Sie unter http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html den besten Wünschen