制作作为第一响应者不可见的单元格的文本字段

时间:2017-04-14 06:59:59

标签: ios swift uitableview

处理有多个字段的登录表单。当用户点击键盘的下一个/完成(默认按钮)按钮时,下一个文本字段应成为第一响应者。 TextField位于UITableView Cell中。当用户单击完成按钮时,我获取下一个单元格并将其textfield作为第一响应者。但是如果下一个单元格不可见,则下一个textField不会成为第一响应者。如何解决这个问题。

func makeTextFieldFirstResponder(textField:UITextField) -> Bool {
     let row = textField.tag 
         let indxPath = IndexPath(row: textField.tag + 1, section: 0)
     if let cell = tblEditViewDetail.cellForRow(at: indxPath) as? InputCell {
        cell.txtField.firstResponder()
}

}

3 个答案:

答案 0 :(得分:3)

来自the docs for cellForRow :

  

表示表格单元格的对象,如果单元格不可见或indexPath超出范围,则为nil。

因此,如果单元格不可见,则返回值应为nil。您应首先使用scrollToRow,然后获取单元格并设置第一响应者。

答案 1 :(得分:1)

让我们做一个技巧。

1)使用第一响应者保存您的下一个文本字段索引。

var respondTextFieldIndex: Int = 0

func makeTextFieldFirstResponder(textField:UITextField) -> Bool {
     let row = textField.tag 
     let indxPath = IndexPath(row: textField.tag + 1, section: 0)

     respondTextFieldIndex= textField.tag + 1

     if let cell = tblEditViewDetail.cellForRow(at: indxPath) as? InputCell {
    cell.txtField.firstResponder()
}

2)在cellForRow函数中,如果您的下一个单元格的索引等于respondTextFieldIndex,请设置它firstResponder

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
{
    let cell = *Your work here*.

    if indexPath.row == respondTextFieldIndex {
       cell.txtField.firstResponder()
    }
}

答案 2 :(得分:-1)

使用下面的代码可以使用此代码。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return arrData.count
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "AddEventCell", for: indexPath) as! AddEventCell
        cell.txtName.tag = indexPath.row
        cell.txtName.delegate = self
        // Configure the cell...

        return cell
    }

    public func textFieldShouldReturn(_ textField: UITextField) -> Bool
    {
        if textField.tag < arrData.count - 1  {
            textField.resignFirstResponder()
            tbl.viewWithTag(textField.tag+1)?.becomeFirstResponder()
        }
        else
        {
            textField.resignFirstResponder()
        }
        return true
    }