我正在做一个非常简单的应用程序,用户在第一个屏幕上输入人数。
在第二个屏幕中,它产生了一个数量的 UITableViewCell
基于用户在第一个屏幕中输入的数字。该 UITableViewCell
拥有 UITextField
我想把这些字段中输入的数据存储在一个数组中,一旦用户点击进入第三个屏幕。
我怎样才能做到这一点? 先谢谢你了!
下面是调用自定义的代码。UITableViewCell
看起来像为我 UIViewController
:
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
textField将丢失。 如果你能确定这种情况不会发生,请使用以下代码(在处理按钮点击的方法中)来组成你的数组。
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
方法,从而将文本保存到数组中。
这里有新的swift版本的答案
var arrayOfNames : [String] = [String]()
var i = 0
while i < taskArrForRead.count {
let indexPath = IndexPath(row: i, section: 0)
let cell : taslakDuzenlemeCell? = self.tableView.cellForRow(at: indexPath) as! taslakDuzenlemeCell?
if let item = cell?.taslakTextField.text {
arrayOfNames.append(item)
}
i = i + 1
}
print("\(arrayOfNames)")