Swift:跳转到CollectionView中的下一个Textfield

时间:2017-03-09 15:05:27

标签: ios swift uicollectionview uitextfield

我试图通过点击输入按钮从Cell中的一个Textfield跳转到CollectionView的下一个Cell中的TextField,但我无法让它工作。

通过为每个Textfield提供相应的indexPath作为Tag,我已经为单元格创建时为所有Textfields分配了一个单独的Tag:

// make a cell for each cell index path
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

    // get a reference to our storyboard cell
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath as IndexPath) as! MyCollectionViewCell

    // Use the outlet in our custom class to get a reference to the UILabel in the cell
    cell.myLabel.text = self.items[indexPath.item]
    cell.myTextField.tag = indexPath.row
    cell.backgroundColor = UIColor(red:0.94, green:0.94, blue:0.94, alpha:1.0) // make cell more visible in our example project

    // Change shape of cells
    cell.layer.cornerRadius = 8

    return cell
}

现在我的意图是,使用下面的代码进入下一个Textfield,如果有的话:

extension ViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    // Try to find next responder
    print(textField.tag) // Test if chosen textfield has individual tag
    if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
    }
    // Do not add a line break
    return false
}

}

但每当我点击enter按钮时,nextField总是为nil,else case将被执行并且键盘消失。 我的猜测是,nextField在其他TextFields的错误位置查找,这就是它找不到它们的原因(每个Cell有一个Textfield,但ViewController中没有TextFields直接)。

由于我对编程很新,我不知道如何解决这个问题。

2 个答案:

答案 0 :(得分:1)

if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField

在此代码中textField.superview是当前单元格。没有视图标记等于textField.tag + 1.您应首先获取下一个单元格,然后获取textFiled。 像这样改变你的代码

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// Try to find next responder 
    print(textField.tag)
// Test if chosen textfield has individual tag
    let nextCell = self.collectionView?.cellForItem(at: IndexPath.init(row: textField.tag + 1, section: 0))
if let nextField = nextCell.viewWithTag(textField.tag + 1) as? UITextField {
    nextField.becomeFirstResponder()
} else {
    // Not found, so remove keyboard.
    textField.resignFirstResponder()
}
    // Do not add a line break
return false
}

答案 1 :(得分:1)

您错误地认为集合视图是每个文本字段的超级视图。事实并非如此。文本字段的超级视图实际上是集合视图单元格的contentView,而后者又是集合视图单元格的一些内部子视图,它最终是集合视图的子视图。

当下一个文本字段甚至不可见时,您还有一个问题是尝试移动到下一个文本字段。

你需要采取不同的方法。在较高级别,您需要在textFieldShouldReturn方法中执行以下操作:

  1. 确定文本字段的单元格的索引路径。
  2. 计算下一个索引路径。
  3. 确保查看下一个索引路径的单元格。
  4. 使下一个单元格的文本字段成为第一个响应者。
  5. 对于步骤1,您需要将文本字段中的一个点转换为集合视图中的一个点。然后使用集合视图方法indexPathForItem(at:)来获取当前文本字段的单元格的索引路径。

    对于第2步,它取决于您的布局。只需增加item即可。可能会增加section。一定要检查你是否在最后一个牢房。

    对于第3步,根据需要滚动集合视图。

    对于步骤4,使用从{2}传入新索引路径的cellForItem(at:)集合视图方法。这将为您提供下一个单元格。然后访问其文本字段并使其成为第一个响应者。