it-swarm.cn

IOS - 如何使用swift以编程方式进行segue

我正在创建一个使用Facebook SDK对用户进行身份验证的应用。我试图在一个单独的类中巩固facebook逻辑。这是代码(为简单起见而剥离):

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???
        }
    }
}

我正在使用上面的类方法来检查会话状态更改,它工作正常。

问: 一旦我拥有了用户的数据,我怎样才能从这个自定义类中转到下一个视图?

编辑: 只是为了清楚,我在故事板上有一个带标识符的segue,我正试图找到一种从不是视图控制器的类执行segue的方法

169
Shlomi Schwartz

如果故事板中存在segue,并且在两个视图之间有一个segue标识符,则可以使用以下命令以编程方式调用它:

performSegue(withIdentifier: "mySegueID", sender: nil)

对于旧版本:

performSegueWithIdentifier("mySegueID", sender: nil)

你也可以这样做:

presentViewController(nextViewController, animated: true, completion: nil)

或者,如果您在导航控制器中:

self.navigationController?.pushViewController(nextViewController, animated: true)
310
Jérôme Leducq

你可以使用 NSNotification

在自定义类中添加post方法:

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil)

在ViewController中添加一个观察者:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "methodOFReceivedNotication:", name:"NotificationIdentifier", object: nil)

在你的ViewController中添加功能:

func methodOFReceivedNotication(notification: NSNotification){
    self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
}
21
Rodrigo Otero

您可以像这样使用segue:

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

    }
}
14
Ricky

如果故事板中存在segue,并且在两个视图之间有一个segue标识符,则可以使用以编程方式调用它

self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)

如果您在导航控制器中

let viewController = YourViewController(nibName: "YourViewController", bundle: nil)        
self.navigationController?.pushViewController(viewController, animated: true)

我会建议您使用导航控制器进行第二种方法。

12
Manish Mahajan

Swift 3 - 也适用于SpriteKit

你可以使用 NSNotification

示例:

1.)在故事板中创建一个segue并将标识符命名为“segue”

2.)在您正在进行的ViewController中创建一个函数。

func goToDifferentView() {

    self.performSegue(withIdentifier: "segue", sender: self)

}

3.)在ViewController的ViewDidLoad()中,您可以创建观察者。

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: "segue" as NSNotification.Name, object: nil)

更新 - 上次我使用这个时,我不得不将.addObserver调用更改为以下代码来消除错误。

NotificationCenter.default.addObserver(self, selector: #selector(goToDifferentView), name: NSNotification.Name(rawValue: "segue"), object: nil)

4.)在您正在查看的ViewController或Scene中,将Post方法添加到您希望触发segue的任何位置。

NotificationCenter.default.post(name: "segue" as NSNotification.Name, object: nil)

更新 - 上次我使用这个时,我不得不将.post调用更改为以下代码来消除错误。

NotificationCenter.default.post(NSNotification(name: NSNotification.Name(rawValue: "segue"), object: nil) as Notification)
12
Timmy Sorensen

您想要做的事情对于单元测试非常重要。基本上,您需要在视图控制器中创建一个小的本地函数。将函数命名为any,只需包含performSegueWithIndentifier

func localFunc() {
    println("we asked you to do it")
    performSegueWithIdentifier("doIt", sender: self)
}

接下来更改您的实用程序类FBManager以包含一个初始化程序,它接受函数的参数和一个变量来保存ViewController执行segue的函数。

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")
    }
}

(方便init允许您在单元测试中使用它而不执行segue。)

最后,你有// todo:segue到下一个视图???,放一些东西:

self.yourFunction()

在单元测试中,您可以简单地将其调用为:

let f = UtilClass()
f.doThatThing()

doThatThing是你的fbsessionstatechange,而UtilClass是FBManager。

对于您的实际代码,只需将localFunc(无括号)传递给FBManager类。

2
Bill

你可以使用performSegueWithIdentifier函数来做这件事。

Screenshot

语法:

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

示例:

 performSegueWithIdentifier("homeScreenVC", sender: nil)
1
Jayprakash Dubey

这对我有用。

首先,在故事板中为视图控制器提供身份检查器中的Storyboard ID。然后使用以下示例代码(确保类,故事板名称和故事板ID与您正在使用的匹配):

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)

有关详细信息,请参阅 http://sketchytech.blogspot.com/2012/11/instantiate-view-controller-using.html best wishes

1
amdan