如何从 UITableView 中的 UITableViewCells 中的 UITextFields 中获取文本并将它们放入数组中(Swift 3)?

Posted

技术标签:

【中文标题】如何从 UITableView 中的 UITableViewCells 中的 UITextFields 中获取文本并将它们放入数组中(Swift 3)?【英文标题】:How can I take the text from UITextFields in UITableViewCells in a UITableView and put them into an array (Swift 3)? 【发布时间】:2016-11-15 08:00:31 【问题描述】:

我正在制作一个计算器应用程序,其中包含一个 UITableView,它允许用户在单击计算器 UIButton 执行计算之前输入变量。我想使用 UITableView 而不仅仅是计划 UITextFields 的原因是因为我的应用程序包含许多不同的计算,这意味着 UITableViewCells 的数量会根据用户的选择而变化。

每当按下计算器 UIButton 时,我希望找到一种方法来获取可见 UITextField 值的数组。 UITableView 类似乎更适合将数据输入单元格而不是获取。我可以使用其他方法吗?我正在使用一个带有 Swift 3 文件的故事板。

【问题讨论】:

表格视图中有多少个 UITextField?可以分享一下tableview的屏幕截图吗? 您使用的是数据,而不是视图,请记住,一旦用户在单元格的文本字段中输入内容,请立即将其存储在 endEditting 的数据源中,然后从那里 能否提供Controller类的详细信息。我通常用一个可以读写的数组来支持 UITableView。数组索引和 UITableViewCell 索引匹配,因此我可以根据数组中的项目识别 UITableView 中的每一行。 【参考方案1】:

由于您没有提供一些示例代码,我将在这里做很多假设。

假设您使用的是 UIViewController,其中包含 UITableView

class CalculatorViewController
    @IBOutlet var tableView: UITableView!
    var values: [Double] = []

    override func viewDidLoad() 
        super.viewDidLoad()
        tableView.dataSource = self
        tableView.delegate = self
    

现在你有了一个基本的 viewController 但编译器会说 CalculatorViewController 不符合UITableViewDataSourceUITableViewDelegate。让我们解决这个问题

extension CalculatorViewController: UITableViewDataSource 

    func numberOfSections(in tableView: UITableView) -> Int 
        // return your number of sections, let say it's one
        return 1
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // Let's say you only have 3 cells at the moment
        return 3
   

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
        let cell = tableView.dequeueReusableCell(withIdentifier: "YourCustomInputFieldCell") as! YourCustomInputFieldCell
        return cell
    


让我们修复UITableViewDelegate 错误

extension CalculatorViewController: UITableViewDelegate 
    // This one gets called each time a cell will be displayed (as it says)
    func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) 
        if let cell = cell as? YourCustomInputTextField 

            // I assume that you expose your cell's input field
            // By setting a tag on the input field you can
            // distinguish it from other inputs

            cell.input.tag = indexPath.row
            cell.input.delegate = self
        
    

编译器会再次抱怨CalculatorViewController 不符合UITextFieldDelegate。让我们也解决这个问题。

extension CalculatorViewController: UITextFieldDelegate 

    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 
        // Here you can check the tag of the textField
        // and update the values array accordingly

        // You should probably convert the string that you get to
        // the number format that you want
        return true
    

希望对你有帮助。

【讨论】:

感谢您提供翔实的回答。 UITextFieldDelegate 是我缺少的部分。 @Kalchi25 欢迎您!如果对您有帮助,请随时接受答案

以上是关于如何从 UITableView 中的 UITableViewCells 中的 UITextFields 中获取文本并将它们放入数组中(Swift 3)?的主要内容,如果未能解决你的问题,请参考以下文章

UITableview:无法从其数据源获取单元格

UIViewController 内的 UITableView? [关闭]

分段 UITableView 中的按钮标记问题

如何根据 UITableView 滚动动态调整 UITableViewCell 的大小?

从自定义单元格返回 NSIndexPath ? (UITableView)

如何在 UITableView 的两个部分之间插入 UIImageView?