Swift performSegueWithIdentifier不工作

Tre*_*ler 38 xcode ios parse-platform swift

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

   @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")
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

我将故事板ID设置为"测试",并且在输入正确信息时不切换视图控制器.有人可以帮我解决我的问题吗?

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

Bas*_*Zen 67

[假设您的代码没有崩溃,而是只是没有发生错误]

至少有一个问题是:

self.performSegueWithIdentifier("Test", sender: self)
Run Code Online (Sandbox Code Playgroud)

应该:

dispatch_async(dispatch_get_main_queue()) {
    [unowned self] in
    self.performSegueWithIdentifier("Test", sender: self)
}
Run Code Online (Sandbox Code Playgroud)

请记住,必须在主线程的队列上执行所有UI操作.你可以通过检查证明你自己错了!

NSThread.isMainThread() // is going to be false in the PF completion handler
Run Code Online (Sandbox Code Playgroud)

附录

如果有任何机会self可能会成为零,如获取驳回或以其他方式释放,因为它是没有必要的,你应该弱捕捉自我为[weak self]unowned和使用安全的解包:if let s = self { s.doStuff() }或可选的链接:self?.doStuff(...)

附录2

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

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

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

NSOperation vs. Grand Central Dispatch(GCD)

GCD [dispatch_*calls]是一种表示将同时执行的工作单元的轻量级方法.

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

附录3

Apple隐藏了单线程规则:

注意

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

SWIFT 4

DispatchQueue.main.async(){
   self.performSegue(withIdentifier: "Test", sender: self)
}
Run Code Online (Sandbox Code Playgroud)

参考:

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

  • 输入此代码后应用程序崩溃. (3认同)
  • 你先生太棒了我已经挣扎了几个星期,这完美地运作了!我永远不会猜到主要队列是问题. (2认同)

Met*_*tte 18

登录问题我遇到了同样的问题.可能我们做同样的教程.在命名segue标识符后,您需要替换:

performSegueWithIdentifier("Klikur", sender: self)
Run Code Online (Sandbox Code Playgroud)

有:

dispatch_async(dispatch_get_main_queue()){

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

}
Run Code Online (Sandbox Code Playgroud)

需要在故事板segue中将seque类型设置为"show(例如Push)".希望它会奏效.


小智 14

确保你把你的: self.performSegue(withIdentifier: ..., ...)

在viewDidAppear或更高版本中.它在viewWillAppear或viewDidLoad中不起作用.


NRi*_*itH 8

您传递给的segue标识符performSegueWithIdentifier(_:sender:)必须与您在故事板中为segue指定的ID 完全匹配.我假设您在登录视图控制器和成功视图控制器之间有一个segue,它应该是应有的; 如果没有,则按住ctrl +从第一个视图控制器拖动到第二个视图控制器,然后在故事板中选择segue的图标并将其ID设置为Klikur.正如一位评论者所说,不要在按钮点击上执行导航,因为这违背了设置segue的主要目的,即在故事板中给出应用程序流的直观指示.

编辑:这是登录视图控制器的代码:

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.
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

以及我正在谈论的segue属性的屏幕截图: 在此输入图像描述


小智 7

swift 3.x

DispatchQueue.main.async(){
    self.performSegue(withIdentifier: "Klikur", sender: self)
}
Run Code Online (Sandbox Code Playgroud)


小智 5

DispatchQueue.main.async() {
    self.performSegue(withIdentifier: "GoToHomeFromSplash", sender: self)`  
}
Run Code Online (Sandbox Code Playgroud)