Swift: 从自定义UITableViewCell中的UITextField中检索文本并将其放入一个数组中。

问题描述 投票:8回答:2

我正在做一个非常简单的应用程序,用户在第一个屏幕上输入人数。

在第二个屏幕中,它产生了一个数量的 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
    }
}
ios uitableview uitextfield
2个回答
16
投票

如果你的表格中的行数超过了屏幕上能容纳的行数,你的方法就有问题了。 在这种情况下,滚动到屏幕外的单元格将被重新使用,而屏幕上的 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 方法,从而将文本保存到数组中。


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)")
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.