it-swarm.com.de

IOS - Programmgesteuertes Seggen mit swift

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

175
Shlomi Schwartz

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)
320
Jérôme Leducq

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)
}
21
Rodrigo Otero

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.

14
Manish Mahajan

Sie können segue folgendermaßen verwenden:

self.performSegueWithIdentifier("Push", sender: self)
override func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) {
    if segue.identifier == "Push" {

    }
}
14
Ricky

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)
12
Timmy Sorensen

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.

2
Bill

Sie können dies mit der Funktion performSegueWithIdentifier tun.

Screenshot

Syntax:

func performSegueWithIdentifier(identifier: String, sender: AnyObject?)

Beispiel:

 performSegueWithIdentifier("homeScreenVC", sender: nil)
1

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

1
amdan