【问题标题】:Swift: retrieving text from a UITextField in a custom UITableViewCell and putting it in an arraySwift:从自定义 UITableViewCell 中的 UITextField 检索文本并将其放入数组中
【发布时间】:2015-02-27 21:02:10
【问题描述】:

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

在第二个屏幕中,它会根据用户在第一个屏幕中输入的数字生成UITableViewCellUITableViewCell 中有一个 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
    }
}

【问题讨论】:

  • 请给我们一些帮助:将任何相关代码添加到您的帖子中。你是用 Swift 还是 Objective-C 工作?纯粹在代码中,还是使用故事板?你走了多远?什么不工作?你得到一个特定的错误吗?谢谢。
  • @pbasdf 现在更清楚了吗?没有什么是行不通的。我只是不知道如何从 EditingCell 类的 UITextfield 中获取数据
  • 非常感谢。您希望您的数组包含所有单元格的nameInput 文本,还是仅包含选定的一个?我假设下一个视图控制器是通过“单击”一个单元格来加载的 - 还是有一个单独的按钮?
  • 是的,我希望将所有单元格的文本按顺序放置在数组中。并通过单击按钮加载下一个视图控制器。
  • 好的。现在有点晚了——我明天去看看。但是为了帮助您入门:您将需要遍历所有行,为每一行构建 indexPath(使用 NSIndexPath(forRow: inSection:)),然后使用 tableView.cellForRowAtIndexPath 来获取关联的单元格。然后您可以访问 cell.nameInput.text 并将其添加到您的数组中。

标签: ios uitableview uitextfield


【解决方案1】:

这里是新的快速回答版本

    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)")

【讨论】:

    【解决方案2】:

    如果表中的行数超过了屏幕上可以容纳的行数,那么您的方法就会出现问题。在这种情况下,滚动到屏幕外的单元格将被重新使用,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)")
    

    或者....

    但是,如果单元格可能会滚动到屏幕外,我建议使用不同的解决方案。为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 方法,从而将文本保存到数组中。

    【讨论】:

    • 如果你的表中没有节,那效果很好,但是你将如何用节来实现呢?
    • 请帮我解决这个问题:stackoverflow.com/questions/36125286/… textfield 确实有效!!但是,我需要再次使用按钮。
    • 谁能在 Swift 3 中提供这个?
    • 这个答案甚至不应该提到从所有单元格中获取数据的选项。
    • 当我选中和取消选中图像时如何处理相同的场景?
    猜你喜欢
    • 2012-06-04
    • 1970-01-01
    • 2014-10-21
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多