我试图通过点击输入按钮从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直接)。
由于我对编程很新,我不知道如何解决这个问题。
答案 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,您需要将文本字段中的一个点转换为集合视图中的一个点。然后使用集合视图方法indexPathForItem(at:)
来获取当前文本字段的单元格的索引路径。
对于第2步,它取决于您的布局。只需增加item
即可。可能会增加section
。一定要检查你是否在最后一个牢房。
对于第3步,根据需要滚动集合视图。
对于步骤4,使用从{2}传入新索引路径的cellForItem(at:)
集合视图方法。这将为您提供下一个单元格。然后访问其文本字段并使其成为第一个响应者。