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最好的祝愿;