首先点击位于表视图单元格内的第二个 UITextfield 未开始编辑(显示光标)。只有第二个水龙头工作。为什么?



我里面有一个表格视图单元格和三个文本字段。我点击第一个(称为"目标")并输入一些数字。将显示键盘,可以通过点击键盘本身上的"完成"按钮来关闭该键盘(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
} 

我尝试过:

  1. 图尔切斯开始了。但我读到它用于普通视图,而不是使用滚动视图,这是我使用表格视图的情况

    override func touchesBegan(touches: Set<UITouch>, withEvent event:
    UIEvent?)
        {
            self.view.endEditing(true)
        }
    
  2. 将 textField.resignFirstResponder() 放入textFieldDidEndEditor().我知道我不希望键盘当用户编辑第二个文本字段时被关闭 我只是尝试检查它是否有效。

  3. 有一个解决方案如何在触摸时关闭键盘表视图背景。但实际上我不需要键盘已关闭,导致用户继续编辑另一个文本字段。通过触摸UITableView的背景关闭键盘
[

第一次点击第二个文本字段不显示光标][2] [2]:https://i.stack.imgur.com/A4voz.png [在第二个文本字段上第二次点击显示光标][3] [3]: https://i.stack.imgur.com/l82A5.png

我想出了解决方案。

textFieldDidEndEditing()功能中,我有tableView.reloadData().因此,操作顺序如下:

  1. 用户触摸文本字段 1 并进行编辑。以下函数在幕后为 textfield1 触发:textFieldShouldBeginEditing()> textFieldDidBeginEditing()
  2. 用户触摸文本字段 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 的答案

最新更新