Swift:从自定义UITableViewCell中的UITextField中检索文本并将其放入数组中
我正在创建一个非常简单的应用程序,用户在第一个屏幕中输入人数。
在第二个屏幕中,它根据用户在第一个屏幕中输入的数字生成许多UITableViewCell
。 UITableViewCell
有一个UITextField
,我试图在用户点击进入第三个屏幕后将输入这些字段的数据存储在一个数组中。
我怎样才能做到这一点?
提前致谢!
编辑:我正在使用故事板。
以下是我的UIViewController
调用自定义UITableViewCell
的代码:
func tableView(tableView:UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ var cell: EditingCell = tableView.dequeueReusableCellWithIdentifier("Cell") as EditingCell if indexPath.row % 2 == 0{ cell.backgroundColor = UIColor.purpleColor() } else { cell.backgroundColor = UIColor.orangeColor() } let person = arrayOfPeople[indexPath.row] cell.setCell(person.name) return cell }
以下是UITableViewCell
的代码:
class EditingCell: UITableViewCell{ @IBOutlet weak var nameInput: UITextField! override func awakeFromNib() { super.awakeFromNib() // Initialization code } override func setSelected(selected: Bool, animated: Bool) { super.setSelected(selected, animated: animated) // Configure the view for the selected state } func setCell(name:String){ self.nameInput.placeholder = name } }
如果表中的行数超过屏幕上可以容纳的数量,则表示您的方法存在问题。 在这种情况下,将重新使用nameInput
屏幕的单元格,并且nameInput
textField的内容将丢失。 如果您可以确定这种情况永远不会发生,请使用以下代码(在处理按钮的方法中)来组成您的数组:
var arrayOfNames : [String] = [String]() for var i = 0; i
另外....
但是,如果单元格可能会在屏幕外滚动,我建议采用不同的解决方案。 设置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() }
这会强制textField完成编辑,从而触发didEndEditing
方法,从而将文本保存到数组中。