我里面有一个表格视图单元格和三个文本字段。我点击第一个(称为"目标")并输入一些数字。将显示键盘,可以通过点击键盘本身上的"完成"按钮来关闭该键盘(resignFirstResponder() 附加到"完成"按钮)。
当我尝试编辑第二个文本字段(称为"实际")而不关闭键盘时,光标在我第一次点击文本字段时不会出现,这意味着编辑没有开始(下图 1)。我需要第二次点击此文本字段才能显示光标(下图 2)。
如何使光标在第一次点击第二个编辑文本字段时出现?
而且我不想隐藏我的键盘(启动 resignFirstResponder()),当用户决定继续输入时,比如说连续输入 4-5 个字段。因此,在文本字段中的编辑应该在用户点击另一个文本字段时结束并开始。他编辑他需要的任何文本字段,然后在最后点击键盘上的完成。
(事实上,如果用户点击了第一个文本字段但未输入任何内容,则第二个文本字段中的光标会在第一次点击时出现)
我的代码:
我突出显示/取消突出显示编辑文本字段的边框:
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
}
我尝试过:
图尔切斯开始了。但我读到它用于普通视图,而不是使用滚动视图,这是我使用表格视图的情况
override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) { self.view.endEditing(true) }
将 textField.resignFirstResponder() 放入textFieldDidEndEditor().我知道我不希望键盘当用户编辑第二个文本字段时被关闭 我只是尝试检查它是否有效。
- 有一个解决方案如何在触摸时关闭键盘表视图背景。但实际上我不需要键盘已关闭,导致用户继续编辑另一个文本字段。通过触摸UITableView的背景关闭键盘
第一次点击第二个文本字段不显示光标][2] [2]:https://i.stack.imgur.com/A4voz.png [在第二个文本字段上第二次点击显示光标][3] [3]: https://i.stack.imgur.com/l82A5.png
我想出了解决方案。
在textFieldDidEndEditing()
功能中,我有tableView.reloadData()
.因此,操作顺序如下:
- 用户触摸文本字段 1 并进行编辑。以下函数在幕后为 textfield1 触发:
textFieldShouldBeginEditing()
>textFieldDidBeginEditing()
-
用户触摸文本字段 2。以下函数在幕后触发:
对于文本字段 1:
textFieldShouldEndEditing()
>textFieldDidEndEditing()
>tableView.reloadData()
对于文本字段 2:
textFieldShouldBeginEditing()
tableView.reloadData()
在文本字段 1 textFieldDidEndEditing()
运行的事实就是文本字段 2 的textFieldDidBeginEditing()
未触发且编辑会话尚未启动的原因。 TableView.reloadData()
推出resignFirstresponder()
.
要克服这种行为,您需要使 textField2 在TableView.reloadData()
之前和之后成为第一响应者。这是代码
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()
})
这是帮助我 https://stackoverflow.com/a/16462473/5826451 的答案