我有两个UITextField
用于登录。我想在发出网络请求时暂时禁用它们,然后在收到网络请求后重新启用它们。
我希望UITextField
在被禁用时也会变灰。
以下是其中一个UITextField
的代码(它们几乎相同,如果我可以禁用一个,那么我可以禁用另一个):
self.user = UITextField()
self.user.placeholder = "Username..."
self.user.keyboardType = UIKeyboardType.EmailAddress
self.user.frame = CGRectMake(20, 200, 300, 40)
self.view.addSubview(user)
我希望稍后在代码中我可以做类似的事情:
self.user.enabled = false
但这似乎没有任何影响。我做的是正确的事情,这会使UITextField
出现灰色吗?
非常感谢。
答案 0 :(得分:2)
您写了: ...在发出网络请求时
必须在主线程上进行UI更改,因此您应该在后台线程上发出网络请求:
self.user.enabled = false
let bg_queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)
dispatch_async(bg_queue, {
// your network request here...
dispatch_async(dispatch_get_main_queue(), {
self.user.enabled = true
})
})
答案 1 :(得分:1)
self.user.enabled = false
应该有效。当您正在进行网络调用时,很可能您没有从主线程执行此代码(UIKit不是线程安全的,只能从主线程更新)。请尝试以下代码:
dispatch_async(dispatch_get_main_queue(), {
self.user.enabled = false
});
这样就可以调度代码在主线程上执行。
答案 2 :(得分:1)
对于 swift 3.0 ,正确的命令是:
myTextField.isUserInteractionEnabled = false
答案 3 :(得分:0)
您还可以使用UIApplication.sharedApplication().beginIgnoringInteractionEvents()
以便忽略视图中的所有内容。然后使用UIApplication.sharedApplication().endIgnoringInteractionEvents()
让用户继续使用该应用。