首先点击位于tableviewcell内的第二个UITextfield没有开始编辑(显示光标)。只有第二个水龙头工作。为什么呢?

时间:2016-01-27 12:35:26

标签: ios keyboard uitextfield tableviewcell

我有一个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
} 

我尝试了什么:

  1. tourchesBegan。但我读到它用于普通视图而不是 使用scrollview,这是我的tableview案例

    override func touchesBegan(touches: Set<UITouch>, withEvent event:
    UIEvent?)
        {
            self.view.endEditing(true)
        }
    
  2. 将textField.resignFirstResponder()放到 textFieldDidEndEditing()。我知道我不想要键盘 当用户编辑第二个文本字段时我被解雇了 检查它是否有效。

  3. 有一个解决方案如何解除触摸键盘 tableview背景。但实际上我不需要键盘 被解雇导致用户继续编辑另一个文本字段。 Dismiss keyboard by touching background of UITableView
  4. [第一个点击第二个文本字段不显示光标] [2] [2]:http://i.stack.imgur.com/A4voz.png     [第二个文本字段上的第二个点击显示光标] [3] [3]:http://i.stack.imgur.com/l82A5.png

1 个答案:

答案 0 :(得分:4)

我找到了解决方案。

textFieldDidEndEditing()函数中我有tableView.reloadData()。因此,操作顺序如下:

  1. 用户触摸textfield1并进行编辑。对于textfield1,幕后面会触发以下功能:textFieldShouldBeginEditing()&gt; textFieldDidBeginEditing()
  2. 用户触摸textfield2。幕后发布了以下功能:

    表示textfield1:textFieldShouldEndEditing()&gt; textFieldDidEndEditing()&gt; tableView.reloadData()

    为textfield2:textFieldShouldBeginEditing()

  3. 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()
            })
    

    这是帮助我https://stackoverflow.com/a/16462473/5826451

    的答案