在Swift中禁用和灰显UITextField

时间:2014-12-08 10:50:27

标签: ios swift

我有两个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出现灰色吗?

非常感谢。

4 个答案:

答案 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()让用户继续使用该应用。