我有一个tableviewcell和三个文本域。我点击第一个(称为“目标”)并输入一些数字。显示键盘,可以通过点击键盘本身上的Done按钮来解除(resignFirstResponder()连接到Done按钮)。
当我尝试编辑第二个文本字段(称为“实际”)而没有键盘解雇时,我第一次点击文本字段时没有出现光标,这意味着编辑没有开始(下面的图像1)。我需要第二次点击此文本字段以显示光标(下面的图像2)。
如何通过第一次点击第二个编辑文本字段来显示光标?
当用户决定继续输入时,我不想隐藏我的键盘(启动resignFirstResponder()),连续说4-5个字段。因此,当用户点击另一个文本字段时,文本字段中的编辑应该结束并开始。他编辑了他需要的任何文本字段,然后在键盘上点击Done。
(实际上,如果用户点击了第一个文本字段但没有输入任何内容,则第一个点击时会出现第二个文本字段中的光标)
我的代码:
我突出显示/破坏编辑文本字段的边框:
func textFieldShouldBeginEditing(textField: UITextField) -> Bool // highlight textfield when editing
{
textField.layer.borderWidth = 1
textField.layer.cornerRadius = 2
textField.layer.borderColor = UIColor.blueColor().CGColor
return true
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool // hide highlight textfield when editing
{
textField.layer.borderWidth = 1
textField.layer.borderColor = UIColor.clearColor().CGColor
return true
}
我在输入变量之前指定文本,我稍后会检查该变量,以防止用户未更改文本时进行数据处理:
func textFieldDidBeginEditing(textField: UITextField) // remember number before user input to prevent actions when no input
{
textInEditField = textField.text!
}
func textFieldDidEndEditing(textField: UITextField)
{
if textField.text == textInEditField // no actions if field is empty or text is not changed
{
return
}
… inputed text processing
}
我尝试了什么:
tourchesBegan。但我读到它用于普通视图而不是 使用scrollview,这是我的tableview案例
override func touchesBegan(touches: Set<UITouch>, withEvent event:
UIEvent?)
{
self.view.endEditing(true)
}
将textField.resignFirstResponder()放到 textFieldDidEndEditing()。我知道我不想要键盘 当用户编辑第二个文本字段时我被解雇了 检查它是否有效。
[第一个点击第二个文本字段不显示光标] [2] [2]:http://i.stack.imgur.com/A4voz.png [第二个文本字段上的第二个点击显示光标] [3] [3]:http://i.stack.imgur.com/l82A5.png
答案 0 :(得分:4)
我找到了解决方案。
在textFieldDidEndEditing()
函数中我有tableView.reloadData()
。因此,操作顺序如下:
textFieldShouldBeginEditing()
&gt; textFieldDidBeginEditing()
用户触摸textfield2。幕后发布了以下功能:
表示textfield1:textFieldShouldEndEditing()
&gt; textFieldDidEndEditing()
&gt; tableView.reloadData()
为textfield2:textFieldShouldBeginEditing()
tableView.reloadData()
在textfield1的textFieldDidEndEditing()
中运行的事实是textfield2的textFieldDidBeginEditing()
未被触发且编辑会话尚未启动的原因。 TableView.reloadData()
启动resignFirstresponder()
。
要克服此行为,您需要在TableView.reloadData()
之前和之后使textField2成为第一个响应者。这是代码
textField2.becomeFirstResponder()
tableView.reloadData()
let delayInSeconds = 0.1
let popTime : dispatch_time_t = dispatch_time(DISPATCH_TIME_NOW, Int64(delayInSeconds * Double(NSEC_PER_SEC)))
dispatch_after(popTime, dispatch_get_main_queue(),
{
nextTextField.becomeFirstResponder()
})
的答案