我正在使用Xcode中的表格视图,其中包含海关单元格和其中的textfield元素。如果将我的表扩展到不需要滚动的位置,那么它可以正常工作,但是我试图让用户单击return时将表向下滚动到下一个单元格,以便使其更小。
在返回部分上向下滚动实际上可以正常工作,问题在于,根据我将表格视图缩小的多少,它将用添加到其中的用户输入替换textField.text元素下方可变数量的单元格前一个单元格。我不知道为什么会这样。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell
cell.id = indexPath.item
cell.tag = indexPath.item
cell.n.tag = indexPath.item
return cell
}
答案 0 :(得分:0)
当前textField
的实现中没有重置cellForRowAt
值。用户在其中一个单元格中输入文本后,它将停留在该位置,并且由于单元格一直在重复使用,因此看起来文本只是随机出现。
用户输入的值必须存储在某处。例如。有字典var userInput = [Int: String]()
。将UITextFieldDelegate
协议添加到您的控制器并实现以下步骤:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let newText = (textField.text as? NSString)?.replacingCharacters(in: range, with: string)
userInput[textField.tag] = newText // store entered text
return true
}
然后只需更新cellForRowAt
:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell
cell.id = indexPath.item
cell.tag = indexPath.item
cell.n.tag = indexPath.item
// update cell's textfield text
cell.textField.delegate = self
cell.textField.tag = indexPath.item
cell.textField.text = userInput[indexPath.item]
return cell
}
答案 1 :(得分:0)
我能够根据您的答案提出一个答案,非常感谢,就在这里。
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
print("Text field cell for row at")
let cell:MyCustomCell = self.tableView.dequeueReusableCell(withIdentifier: cellReuseIdentifier) as! MyCustomCell
if firstTable < numP{
cell.n.text = nil
cell.firstTime=true
cell.n.tag = indexPath.row
return cell
}
else{
cell.n.text = names[indexPath.row]
cell.n.tag = indexPath.row
return cell
}
}
在我的代码中,每次添加用户输入时,变量“ firstTable”都会递增(在另一个函数中),直到达到预期的总输入量为止(基于先前的视图输入)。在“ if”内部,它使用文本值重置为nil的空白单元格来收集用户输入,但是一旦firstTable>#应该位于数组中,则“ else”部分将使用数组中的元素来呈现表用户输入以填充单元格。