我的Swift segue完全没有工作,也没有任何错误。断点告诉我应用程序落在这条线上但没有任何反应:
self.performSegueWithIdentifier("SignupSegue", sender: self)
代码块是Facebook的登录表单:
if let accessToken: FBSDKAccessToken = FBSDKAccessToken.currentAccessToken() {
PFFacebookUtils.logInInBackgroundWithAccessToken(result.token, block: {
(user: PFUser ? , error : NSError ? ) - > Void in
if user!.isNew {
self.performSegueWithIdentifier("SignupSegue", sender: self)
} else {
self.navigateToInGame(true)
}
})
}
这里有它应该调用的segue函数,但是它甚至没有达到它:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if (segue.identifier == "SignupSegue") {
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("SignUpViewController")
self.showViewController(vc, sender: self)
}
}
有什么想法吗?
答案 0 :(得分:2)
通常,任何UI更新都必须在主线程中。我认为PFFacebookUtils.logInInBackgroundWithAccessToken
的阻止在上述情况下仍然处于后台状态。也许会触发showViewController
中的dispatch_async(dispatch_get_main_queue(), {})
并查看是否存在任何差异。
dispatch_async(dispatch_get_main_queue(), {
let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let vc = storyboard.instantiateViewControllerWithIdentifier("SignUpViewController")
self.showViewController(vc, sender: self)
})
答案 1 :(得分:2)
确定。我刚试了一下。希望你做了关于StoryBoard Reference的所有事情。 我也遇到了与performSegueWithIdentifier相同的问题。
实施例: 我们来两个故事板主和注册。
1)在main.storyboard
中创建一个故事板参考。将故事板参考中的storyboardId
设置为signup
,将referencedId
设置为storyboardId
中场景(viewController)的signup.storyboard
。请查看此链接以获得清晰的图片Storyboard to Storyboard
2)在viewController
Storyboard Reference
和main.storyboard
之间设置segue标识符
3)由于我遇到performSegueWithIdentifier
同样的问题,我将其替换为shouldPerformSegueWithIdentifier
。
override func shouldPerformSegueWithIdentifier(identifier: String, sender: AnyObject?) -> Bool {
if(identifier == "segue_identifier"){
// segue_identifier is the viewController and storyBoard Reference segue identifier.
print("hello")
}
return true;
}
如果您发现任何问题,请告诉我。它对我有用。
答案 2 :(得分:1)
执行segue会导致呈现一个新的视图控制器。您不需要也不能在prepareForSegue
中创建和显示视图控制器。它将如下所示:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?)
{
if (segue.identifier == "SignupSegue") {
let vc = segue.destinationViewController
}
}
答案 3 :(得分:0)
Swift 3解决了:
[w[i], W-w].min
答案 4 :(得分:0)
你可以试试这个......
errno = 0;
some_function();
if ( errno ) {
:
:
答案 5 :(得分:0)
最接近我可以为自己克服同样的问题:
在类中初始化的触发器 var segueLogin:Bool = false 。
当PFFacebookUtils获得segue所需的值时,将触发器更改为true:
PFFacebookUtils.logInInBackground(withReadPermissions: permissions) {
(user: PFUser?, error: Error?) -> Void in
if let user = user {
if user.isNew {
print("User signed up and logged in through Facebook!")
self.segueLogin = true
} else {
print("User logged in through Facebook!")
self.segueLogin = true
}
} else {
print("Uh oh. The user cancelled the Facebook login.")
self.loginCancelledLabel.alpha = 1
}
}
然后将代码添加到 viewDidAppear 类。实现它每次PFFacebookUtils完成时启动。因此它会检查返回值是否为true并在成功执行PFFacebookUtils会话后执行segue:
override func viewDidAppear(_ animated: Bool) {
if segueLogin == true {
self.performSegue(withIdentifier: "segueSingup", sender: self)
}
}