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

   @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设置为"测试",当输入正确的信息时,它不会切换视图控制器.有人能帮我解决问题吗?

Here is the code for the LoginViewController

推荐答案

[假设您的代码没有崩溃,只是无法继续]

至少有一个问题是:

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

应该是:

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

请记住,所有UI操作都必须在主线程的队列上执行.您可以通过判断以下内容来证明自己走错了方向:

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

ADDENDUM

如果self有可能变成零,比如因为不需要而被解雇或以其他方式解除分配,那么您应该将self弱捕获为[weak self]而不是unowned,并使用安全展开:if let s = self { s.doStuff() }或可选链接:self?.doStuff(...)

ADDENDUM 2

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

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

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

NSOperation vs.Grand Central Dispatch(GCD)

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

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

ADDENDUM 3

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

笔记

在大多数情况下,只能从应用程序的主线程使用UIKit类.

SWIFT 4

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

参考:

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

Swift相关问答推荐

如何使用RxSwift根据数据数绘制UICollectionView单元格

体积单位从夸脱转换为杯似乎关闭了

在用户将输入保存到SWIFT中的核心数据后,如何创建指向我的应用程序S主页的链接?

如何在AudioKit中实现自定义音效 node ?

在visionOS RealityView中使用.GenerateText时,未显示Reality Composer Promaterial 纹理

SwiftUI路径平滑连接两条线

SwiftUI如何能够在Text中使用字符串字面量来创建LocalizedStringKey?

为什么我在我的 Swift iOS 应用程序项目中收到 Xcode 中的错误消息无法识别的 Select 器发送到类?

从 actor 的 init 方法调用方法

swift 是否遇到 Java 的 2gb 最大序列化大小问题?

MainActor 隔离可变存储属性为何会出现可发送错误?

如何从另一个 swift 文件中调用函数

带有屏幕参数的 NSWindow 初始化程序在初始化时导致致命错误

如何让 UIKit 挤压你的视图,使其适合屏幕

在 iOS 中使用 Swift 保存 PDF 文件并显示它们

为什么'nil' 与 Swift 3 中的 'UnsafePointer' 不兼容?

如何快速识别字符串中的大写和小写字符?

将活动指示器 colored颜色 更改为黑色

如何在 Swift 中判断变量的类型

使用 JSONEncoder 对类型为 Codable 的变量进行编码