Swift:如何从自定义UITableViewCell的UITextField中获取文本并将其放入数组中

8
我正在制作一个非常简单的应用程序,在第一个屏幕上,用户输入人数。
在第二个屏幕上,根据用户在第一个屏幕中输入的数字生成一些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
    }
}

1
请给我们一些线索:在您的帖子中添加任何相关代码。您是在使用Swift还是Objective-C?纯粹使用代码还是使用故事板?您已经做到了什么程度?有什么问题?您是否收到了特定的错误?谢谢。 - pbasdf
@pbasdf 现在更清楚了吗?没有任何问题,我只是不知道如何从EditingCell类中获取UITextfield的数据。 - Unis Barakat
非常感谢。您希望您的数组包含所有单元格的“nameInput”文本,还是仅包含所选单元格的文本?我假设下一个视图控制器是通过“点击”单元格加载的 - 还是有一个单独的按钮? - pbasdf
是的,我希望所有单元格的文本按顺序放置在数组中,下一个视图控制器通过点击按钮加载。 - Unis Barakat
好的。现在有点晚了,我明天会看一下。但是为了帮助你开始:你需要循环遍历所有行,为每一行构建indexPath(使用NSIndexPath(forRow:inSection:)),然后使用tableView.cellForRowAtIndexPath获取相关联的单元格。然后你就可以访问cell.nameInput.text并将它添加到你的数组中。 - pbasdf
@vidalbenjoe,这个问题是在你所提到的那个问题之前两年就被问过了。 - Unis Barakat
2个回答

17

如果您的表格行数超过屏幕容纳数量,那么您的方法存在问题。在这种情况下,滚动出屏幕的单元格将被重新使用,并且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)")

或者

然而,如果可能存在单元格滚动屏幕外的情况,我建议采用不同的解决方案。为nameInput文本字段设置delegate,然后使用委托方法在输入名称时获取它们。

首先,在您的视图控制器中添加变量,以保存数组和当前正在编辑的文本字段的行号。

    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方法,以将文本保存到数组中。


如果您的表中没有分区,那么这个方法可以很好地工作,但是如果有分区,您该如何实现呢? - Adarkas2302
帮我看一下这个:http://stackoverflow.com/questions/36125286/getting-the-value-textfield-from-form-based-uitableview。这个文本框真的好用!但是,我还需要再次求助关于按钮的问题。 - Thiha Aung
有人能用Swift 3提供这个吗? - Anup Gupta
这个答案甚至不应该提到从所有单元格获取数据的选项。 - rmaddy
当我有选中和取消选中的图像时,我该如何处理相同的情况? - Vinod

0

这里是关于新的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)")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接