Swift: Become First Responder on UITextField Not Working?
我在Storyboard上创建了一个带有一个UITextField的自定义UIViewController。 在viewDidLoad上,我将UITextFIeld设置为becomeFirstResponder,什么也没发生(没有弹出键盘)。
然后,我尝试调用resignFirstResponder(),但返回false。 接下来,我尝试通过使用@上的代码循环所有子视图来查找first responder是谁,而不使用私有API来获取当前的第一响应者。 事实证明,所有子视图都不是第一响应者。
故事板中的我的ViewController
我的密码
1 2 3 4 5 6 7 8 9 10 11 12
| class BLTestViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var tf: UITextField
override func viewDidLoad() {
super.viewDidLoad()
tf.delegate = self
tf.becomeFirstResponder()
// Do any additional setup after loading the view.
}
} |
变得如此简单...为什么不是键盘来了!!! 我要做的一件事是自动布局,但是我不确定这是否会影响键盘弹出。
-
尝试使您的文本字段成为viewWillDidAppear:中的第一响应者。
-
都试过了,没有运气。
-
文本字段是否通过插座连接到视图控制器?
-
一个简单的主意,我认为您可能仍然在viewDidAppear等中调用它为时过早...只是为了测试您是否可以设置按钮来调用包含tf.becomeFirstResponder()的方法,因此我们可以排除计时问题
-
是的,textField作为IBOutlet连接。我尝试将tf.becomeFirstResponder()放在func textFieldShouldBeginEditing(textField: UITextField!) -> Bool中,这是我最终想要的位置,并且比viewDidAppear晚,但出现了"错误访问异常"。
-
您是否正在模拟器中进行测试?键盘没有出现在Beta 4的模拟器中。在设备上运行可以显示它。
-
是的,我正在模拟器上运行,正在尝试在设备上运行它,但是它说"没有兼容的iOS版本提供预配置的iOS设备..."我刚刚将其iPhone 5更新为最新的iOS版本。
-
该问题仅在使用iPhone 4s模拟器的Xcode 6 b5上出现。该代码对于iPhone 5s模拟器非常有效。你应该提起雷达。
-
旁注:您不应从textFieldShouldBeginEditing()内部调用becomeFirstResponder()
-
@Eugene。我认为您是对的,这似乎与xCode 6模拟器本身有关!上帝该死的苹果。
-
@bennett似乎有一种简单的方法可以将键盘调高。在模拟器中选择要编辑的文本字段,然后按Command + k
-
参见[这个问题] [1]。基本上按Apple + K [1]:stackoverflow.com/questions/24420873/
-
抱歉,它对您没有用,但是您的代码对我来说很棒。 +1
-
.....删除.....
-
看看这个[解决方案] [1],它会有所帮助;)[1]:stackoverflow.com/questions/24420873/
-
可以在canFirstResponder之前尝试,然后成为FirstResponder。
我只是通过调用self.tf.becomeFirstResponder() indside viewDidLoad()函数使用文本字段对其进行了测试,并且它的工作原理绝对不错。 您需要按nflacco所指出的那样,通过按Command + K来切换键盘,并在模拟器中禁用硬件键盘,如下所示:
iOS模拟器->硬件->键盘
取消选中"连接硬件键盘"
Swift 4对我有用
试试吧
1 2 3 4 5 6 7 8
| override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
DispatchQueue.main.async {
self.textView.becomeFirstResponder()
}
} |
-
谢谢。 那是我的解决方案。
-
从调度队列内部执行对我来说是成功的。
我认为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class BLTestViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var tf: UITextField
override func viewDidLoad() {
super.viewDidLoad()
tf.delegate = self
self.focustf()
// Do any additional setup after loading the view.
}
func focustf(){
self.tf.becomeFirstResponder()
}
} |
Swift 4和iOS 11
就我而言,我没有尝试过,在尝试之前,我无法设置第一响应者。
1 2 3 4 5 6 7
| func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
if cell.isKind(of: YOURTABLEVIEWCELL.self) {
if let yourCell = cell as? YOURTABLEVIEWCELL{
yourCell.yourUiTextField.becomeFirstResponder()
}
}
} |
希望这可以帮助遇到同样问题的人。
-
就我而言,当用户单击该部分的行时,我需要关注自定义标题部分的文本字段。 可能吗? 我试图以同样的方式在索引路径中选择行,但对我不起作用。
-
@HariNarayanan,可以尝试与上述类似,但使用tableView(_ tableView:UITableView,willDisplayHeaderView视图:UIView,forSection部分:Int)