我正在创建一个使用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到下一个视图?
我在storyboard上有一个带标识符的segue,我试图找到一种方法从一个不是视图控制器的类执行segue
对于单元测试来说,您想要做的事情非常重要。基本上你需要在视图控制器中创建一个小的本地函数。给函数起任何名字,只要包括performseguewithidentifier。
func localFunc() {
println("we asked you to do it")
performSegueWithIdentifier("doIt", sender: self)
}
接下来改变你的实用工具类FBManager,包括一个初始化器,它接受一个函数的参数和一个变量来保存执行segue的ViewController的函数。
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类。
如果你的segue存在于故事板中并且在你的两个视图之间有一个segue标识符,你可以用编程方式调用它
self.performSegueWithIdentifier("yourIdentifierInStoryboard", sender: self)
如果你在导航控制器
let viewController = YourViewController(nibName: "YourViewController", bundle: nil)
self.navigationController?.pushViewController(viewController, animated: true)
我会推荐你使用导航控制器的第二次进近。
Swift 3 -也与SpriteKit一起工作
你可以使用NSNotification。
例子:
1)。在故事板中创建一个segue并将标识符命名为segue
2)。在你要segue的ViewController中创建一个函数。
func goToDifferentView() {
self.performSegue(withIdentifier: "segue", sender: self)
}
3)。在ViewController的ViewDidLoad()中,你从创建观察者开始segue。
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)。在你要segue到的ViewController或Scene中,在你想要segue被触发的地方添加Post方法。
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存在于故事板中,并且在你的两个视图之间有一个segue标识符,你可以通过编程方式调用它:
performSegue(withIdentifier: "mySegueID", sender: nil)
对于旧版本:
performSegueWithIdentifier("mySegueID", sender: nil)
你还可以:
presentViewController(nextViewController, animated: true, completion: nil)
或者如果你在导航控制器中:
self.navigationController?.pushViewController(nextViewController, animated: true)
对于单元测试来说,您想要做的事情非常重要。基本上你需要在视图控制器中创建一个小的本地函数。给函数起任何名字,只要包括performseguewithidentifier。
func localFunc() {
println("we asked you to do it")
performSegueWithIdentifier("doIt", sender: self)
}
接下来改变你的实用工具类FBManager,包括一个初始化器,它接受一个函数的参数和一个变量来保存执行segue的ViewController的函数。
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类。