Swift执行SegueWithIdentifier不起作用

我想在用户成功login到他们的帐户后切换视图控制器,但它不能正常工作。 我不能直接使用segue,因为如果单击loginbutton,它将转到该视图控制器,无论信息是否正确。 我已经尝试了我所知道的没有成功的一切。 这是我正在尝试的代码。

@IBAction func loginTapped(sender: AnyObject) { let username = usernameField.text let password = passwordField.text if username.isEmpty || password.isEmpty { var emptyFieldsError:UIAlertView = UIAlertView(title: "Please try again", message: "Please fill in all the fields we can get you logged in to your account.", delegate: self, cancelButtonTitle: "Try again") emptyFieldsError.show() } PFUser.logInWithUsernameInBackground(username, password:password) { (user: PFUser?, error: NSError?) -> Void in if user != nil { self.performSegueWithIdentifier("Klikur", sender: self) } else { if let errorString = error!.userInfo?["error"] as? String { self.errorMessage = errorString } self.alertView("Please try again", message: "The username password combiation you have given us does not match our records, please try again.", buttonName: "Try again") } } } 

我将故事板ID设置为“testing”,并且在input正确的信息时不会切换视图控制器。 有人能帮我解决我的问题吗?

这里是LoginViewController的代码 这是KlikurTableViewController的属性面板

[假设你的代码没有崩溃,而只是不能继续]

至less有一个问题是:

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

应该:

 dispatch_async(dispatch_get_main_queue()) { [unowned self] in self.performSegueWithIdentifier("Test", sender: self) } 

请记住,所有UI操作必须在主线程队列中执行。 您可以通过检查以certificate自己是错误的线程:

 NSThread.isMainThread() // is going to be false in the PF completion handler 

附录

如果有什么机会可能成为零,比如因为不需要而被解雇或者解除分配,那么你应该自我[weak self][weak self]而不是unowned ,并且使用安全的解包: if let s = self { s.doStuff() }或可选的链接: self?.doStuff(...)

附录2

这似乎是一个受欢迎的答案,所以在这里提到这个更新的select是很重要的:

 NSOperationQueue.mainQueue().addOperationWithBlock { [weak self] in self?.performSegueWithIdentifier("Test", sender: self) } 

请注意,从https://www.raywenderlich.com/76341/use-nsoperation-nsoperationqueue-swift

NSOperation与大中央调度(GCD)

GCD [dispatch_ * calls]是表示要同时执行的工作单元的轻量级方式。

与GCD相比,NSOperation增加了一些额外的开销,但是您可以在各种操作之间添加依赖关系,并重新使用,取消或挂起它们。

附录3

苹果在这里隐藏了单线程的规则:

注意

大多数情况下,只能从您的应用程序的主线程使用UIKit类。 对于从UIResponder派生的类或者以任何方式涉及操纵应用程序用户界面的类尤其如此。

参考:

https://developer.apple.com/documentation/uikit

我有login问题相同的问题。 可能我们做同样的教程。 命名您的segue标识符后,您需要replace:

 performSegueWithIdentifier("Klikur", sender: self) 

有:

 dispatch_async(dispatch_get_main_queue()){ self.performSegueWithIdentifier("Klikur", sender: self) } 

types的seque需要被设置为“在showboard segue中显示(例如Push)”。 希望它能工作。

您传递给performSegueWithIdentifier(_:sender:)的segue标识符必须与您在storyboard中给出的segue的ID 完全匹配。 我假设你在login视图控制器和成功视图控制器之间有一个继续,这是它应该是; 如果没有,按Ctrl +拖动从第一个到第二个视图控制器,然后在故事板中selectSegue的图标,并将其ID设置为Klikur 。 正如一位评论者所说的, 不要按照button点击导航,因为这会影响游戏的主要目的,即在故事板上给出应用程序stream的可视化指示。

编辑:这是一个login视图控制器的代码:

 import UIKit class ViewController: UIViewController { @IBOutlet weak var usernameField: UITextField! @IBOutlet weak var passwordField: UITextField! @IBAction func attemptLogin(sender: AnyObject) { if !usernameField!.text!.isEmpty && !passwordField!.text!.isEmpty { performSegueWithIdentifier("Klikur", sender: self) } } override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if "Klikur" == segue.identifier { // Nothing really to do here, since it won't be fired unless // shouldPerformSegueWithIdentifier() says it's ok. In a real app, // this is where you'd pass data to the success view controller. } } } 

以及我正在谈论的segue属性的屏幕截图: 在这里输入图像说明

迅速3.x

 DispatchQueue.main.async(){ self.performSegue(withIdentifier: "Klikur", sender: self) } 

检查以确保您在可见的视图控制器上运行执行segue。

这是一个边缘情况,但是当我尝试在属于我当前不可见的UIPageViewController的视图控制器上运行它时,我的执行segue失败。 如果我尝试在属于我的UIPageViewController的所有视图控制器(包括当前可见的视图控制器)上执行segue,它也失败。 解决的办法是跟踪哪个视图控制器当前在我的UIPageViewController中可见,并且只在该视图控制器上执行segue。

 DispatchQueue.main.async() { self.performSegue(withIdentifier: "GoToHomeFromSplash", sender: self)` } 

一个login的例子。 单击button(操作)后,如果login成功,则可以使用:

 self.performSegue(withIdentifier: "loginSucess", sender: nil) 

但是,如果你启动的应用程序,你从你的钥匙链的证书,你需要使用这个作为theard的一部分:

 DispatchQueue.main.async(){ self.performSegue(withIdentifier: "sessionSuccess", sender: nil) }