Ios 单击按钮并执行其他UI任务
当用户点击一个按钮时,我想检查我的用户名/密码文本框是否有效(包含文本),如果无效,在每个框旁边画一个红色的x。如果它是有效的(用户提供了用户名/密码),那么我想使用标识符执行一个segue 当我尝试这个并点击按钮时,一切都冻结了。如果我进行了验证,然后将ui更新包装为异步,它将不再在视觉上锁定按钮(但我仍然无法单击它)。我肯定我错过了一些对GCD至关重要的东西,但有人能帮我吗?我觉得无论我尝试什么,一切都会锁定,我的图标不会出现/表单冻结/无响应。谢谢Ios 单击按钮并执行其他UI任务,ios,swift,ios8,xcode6,Ios,Swift,Ios8,Xcode6,当用户点击一个按钮时,我想检查我的用户名/密码文本框是否有效(包含文本),如果无效,在每个框旁边画一个红色的x。如果它是有效的(用户提供了用户名/密码),那么我想使用标识符执行一个segue 当我尝试这个并点击按钮时,一切都冻结了。如果我进行了验证,然后将ui更新包装为异步,它将不再在视觉上锁定按钮(但我仍然无法单击它)。我肯定我错过了一些对GCD至关重要的东西,但有人能帮我吗?我觉得无论我尝试什么,一切都会锁定,我的图标不会出现/表单冻结/无响应。谢谢 @IBAction func btnL
@IBAction func btnLoginTapped(sender: UIButton) {
//Reset validation
txtUsername.rightView = nil
txtPassword.rightView = nil
var isFormValid = true
var errorImageView = UIImageView(image: UIImage(named: ("redx")))
errorImageView.frame = CGRectMake(5, (view!.frame.size.height - 20) / 2, 20, 20)
errorImageView.contentMode = UIViewContentMode.Center
if ((self.txtUsername.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).utf16Count == 0) || (self.txtPassword.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).utf16Count == 0)) {
isFormValid = false
dispatch_async(dispatch_get_main_queue()) {
if (self.txtUsername.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).utf16Count == 0) {
self.txtUsername.rightView = errorImageView
self.txtUsername.rightViewMode = UITextFieldViewMode.Always
}
if (self.txtPassword.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).utf16Count == 0) {
self.txtPassword.rightView = errorImageView
self.txtPassword.rightViewMode = UITextFieldViewMode.Always
}
}
}
if (isFormValid) {
..do other stuff, potentially also a segue with identifier
}
}
我确定(正如用户所说)这与异步线程或ui线程无关,因为我试图在密码字段上执行此操作:
txtPassword.rightViewMode = UITextFieldViewMode.Always
这似乎锁定了线程,但并没有抛出错误,这很奇怪。
我将避免这种情况。您不需要在此处使用GCD来更新UI。您是否在发布的方法中遗漏了任何内容?似乎该方法的“冻结”用户界面中的某些内容。。。通常情况下,UI会在方法结束时更新,但由于它在GCD块中更新,因此您似乎在方法结束前“冻结”。当您输入正确的用户名/密码时,应用程序是否能够导航到下一个view controller?您不需要isFormValid属性。定义一个else来调用viewcontroller。同时删除dispatch_async并将nslog添加到if和else,然后检查应用程序是否冻结。(self.txtPassword.text.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()).utf16Count==0)这似乎是问题所在,特别是密码字段有可能出错吗?