IOS – 如何使用Swift以编程方式继续

我正在创build一个使用Facebook SDK来authentication用户的应用程序。 我正试图巩固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,我试图find一种方法来执行segue从类不是视图控制器

如果您的segue存在于两个视图之间的segue标识符的故事板中,则可以使用以下代码以编程方式调用它:

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

对于旧版本:

 performSegueWithIdentifier("mySegueID", sender: nil) 

你也可以这样做:

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

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

 self.navigationController?.pushViewController(nextViewController, animated: true) 

你可以使用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) } 

Swift 3也适用于SpriteKit

你可以使用NSNotification

例:

1.)在故事板中创build一个segue,并将其标识为“segue”

2.)在你正在继续的ViewController中创build一个函数。

 func goToDifferentView() { self.performSegue(withIdentifier: "segue", sender: self) } 

3.)在ViewController的ViewDidLoad()中,您正在创build观察者。

 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) 

你可以像这样使用segue

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

你想做什么对unit testing非常重要。 基本上你需要在视图控制器中创build一个小的本地函数。 命名该函数任何东西,只包括performSegueWithIndentifier

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

接下来改变你的实用工具类FBManager以包含一个初始化函数,它接受一个函数的参数和一个variables来保存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允许你在unit testing中使用它,而不需要执行segue。)

最后,你有// todo的地方:继续下一个视图???,把一些东西沿着:

 self.yourFunction() 

在你的unit testing中,你可以简单地调用它:

 let f = UtilClass() f.doThatThing() 

doThatThing是你的fbsessionstatechange, UtilClass是FBManager。

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

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

截图

句法 :

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

例如:

  performSegueWithIdentifier("homeScreenVC", sender: nil) 

这对我有效。

首先给你的故事板的视图控制器在身份检查器内的故事板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最好的祝愿;