如果表中的行数超过屏幕上可以容纳的行数,则您的方法就会出现问题。在这种情况下,滚动到屏幕外的单元格将被重新使用,并且单元格的内容nameInput
文本字段将丢失。如果您可以确定这种情况永远不会发生,请使用以下代码(在处理按钮点击的方法中)来组成数组:
var arrayOfNames : [String] = [String]()
for var i = 0; i<self.arrayOfPeople.count; i++ {
let indexPath = NSIndexPath(forRow:i, inSection:0)
let cell : EditingCell? = self.tableView.cellForRowAtIndexPath(indexPath) as EditingCell?
if let item = cell?.nameInput.text {
arrayOfNames.append(item)
}
}
println("\(arrayOfNames)")
或者....
但是,如果单元格可能会滚动到屏幕之外,我建议采用不同的解决方案。设置delegate
为了nameInput
文本字段,然后使用委托方法来获取输入的名称。
首先,将变量添加到视图控制器,以保存当前正在编辑的文本字段的数组和行号。
var arrayOfNames : [String] = [String]()
var rowBeingEdited : Int? = nil
然后,在你的cellForRowAtIndexPath
方法,添加:
cell.nameInput.text = "" // just in case cells are re-used, this clears the old value
cell.nameInput.tag = indexPath.row
cell.nameInput.delegate = self
然后添加两个新函数,以捕获文本字段何时开始/结束编辑:
func textFieldDidEndEditing(textField: UITextField) {
let row = textField.tag
if row >= arrayOfNames.count {
for var addRow = arrayOfNames.count; addRow <= row; addRow++ {
arrayOfNames.append("") // this adds blank rows in case the user skips rows
}
}
arrayOfNames[row] = textField.text
rowBeingEdited = nil
}
func textFieldDidBeginEditing(textField: UITextField) {
rowBeingEdited = textField.tag
}
当用户点击该按钮时,他们可能仍在编辑其中一个名称。为了满足这一点,请将以下内容添加到处理按钮点击的方法中:
if let row = rowBeingEdited {
let indexPath = NSIndexPath(forRow:row, inSection:0)
let cell : EditingTableViewCell? = self.tableView.cellForRowAtIndexPath(indexPath) as EditingTableViewCell?
cell?.nameTextField.resignFirstResponder()
}
这会强制文本字段完成编辑,从而触发didEndEditing
方法,从而将文本保存到数组中。