【问题标题】:Get all values from tableViewCell from TextFields从 TextFields 中获取 tableViewCell 中的所有值
【发布时间】:2019-06-28 06:45:06
【问题描述】:

我想通过TextFieldsTableViewCell 获取所有,但我不明白如何通过单击按钮来实现。

如果我点击按钮Add,我可以添加新行。所以我可以创建任意多的行。

我的代码在这里:

struct Section {
    let title: String
    var rows: [String]
}

class SettingsScheduleAndPricesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UITextFieldDelegate {

    var hall: Halls?

    var sections = [Section]()

    override func viewDidLoad() {
        super.viewDidLoad()
        sections = [Section(title: "Day of week", rows: []),
                    Section(title: "Second section", rows: [""]),
                    Section(title: "Third section", rows: [""])]
    }

    // MARK: - TableView
    func numberOfSections(in tableView: UITableView) -> Int {
        return sections.count
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return sections[section].rows.count
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        if indexPath.section == 0 {
            ...
        } else if indexPath.section == 1 {
            let hourlyRateCell = tableView.dequeueReusableCell(withIdentifier: "hourlyRateCell", for: indexPath) as! SettingsHourlyRateCell
            return hourlyRateCell
        } else {
            ...
        }
    }

    func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return sections[section].title
    }

    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        let frame: CGRect = tableView.frame
        if section == 0 {
            let headerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
            headerView.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
            return headerView
        } else if section == 1 {
            let addButton: UIButton = UIButton(frame: CGRect(x: frame.size.width - 50, y: 0, width: 50, height: 30))
            addButton.backgroundColor = UIColor.clear
            addButton.setTitleColor(#colorLiteral(red: 0.2588235438, green: 0.7568627596, blue: 0.9686274529, alpha: 1), for: .normal)
            addButton.setTitle(NSLocalizableAdd, for: .normal)
            addButton.addTarget(self, action: #selector(SettingsScheduleAndPricesViewController.addHourlyRate(sender:)), for: .touchUpInside)
            let headerView: UIView = UIView(frame: CGRect(x: 0, y: 0, width: frame.size.width, height: frame.size.height))
            headerView.backgroundColor = #colorLiteral(red: 0.8039215803, green: 0.8039215803, blue: 0.8039215803, alpha: 1)
            headerView.addSubview(addButton)
            return headerView
        } else {
            ...
        }
    }

    @IBAction func saveBarButtonPressed(_ sender: Any) {

        // here I want to get all values from my Cell from my TextFields

    }

    @objc func addHourlyRate(sender: UIButton) {
        let newRow = ""
        append(row: newRow, in: 1)
    }

    func append(row : String, in section: Int) {
        let insertionIndex = sections[section].rows.count
        sections[section].rows.append(row)
        let indexPath = IndexPath(row: insertionIndex, section: section)
        tableView.insertRows(at: [indexPath], with: .automatic)
    }
}

class SettingsHourlyRateCell: UITableViewCell, UITextFieldDelegate {
    @IBOutlet weak var rubHourTF: UITextField!
}

我的模拟器示例:

在我的示例中,我需要从三行中获取 firstsecondthird 字符串文本。并附加在空的array 中或仅打印在console 中。

在方法@IBAction func saveBarButtonPressed(_ sender: Any).

我找不到任何可以帮助我的东西。

【问题讨论】:

  • 在您的previous answer (accepted) 中,我建议使用自定义结构作为数据源。为什么要回到丑陋的多个数组?最有效的方法是使用具有引用语义的类(而不是结构)并将行项传递给单元格。在单元格中更新数据源项中的属性。但是你不能用多个数组来做到这一点。
  • @vadian 我更正了,谢谢:)

标签: ios swift uitableview uitextfield


【解决方案1】:

也许我的方法会对某人有所帮助,但我仍然设法做到了。我只需在我的button 中添加此代码:

@IBAction func saveBarButtonPressed(_ sender: Any) {
    let countRowsOne = tableView.numberOfRows(inSection: 1)
        for index in 0...countRowsOne {
            let indexPath = IndexPath(row: index, section: 1)
            if let cell = tableView.cellForRow(at: indexPath) as? SettingsHourlyRateCell {
                ...
            }
            ...
        }
    }
}

【讨论】:

    【解决方案2】:

    TableView 单元格中的文本字段可能很棘手。首先,像这样使用数据模型和 reloadData() 而不是 insertRows(at:):

    @objc func addHourlyRate(sender: UIButton) {
        let newRow: String = ""
        secondRowText.append(newRow)
        self.tableView.reloadData()
    }
    

    现在,设置单元格中的文本,并用 cellForRowAt() 中的行号标记 UITextField,如下所示:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
       let hourlyRateCell = tableView.dequeueReusableCell(withIdentifier: "hourlyRateCell", for: indexPath) as! SettingsHourlyRateCell
       hourlyRateCell.rubHourTF.text = secondRowText[indexPath.row]
       hourlyRateCell.rubHourTF.tag = indexPath.row              
       return hourlyRateCell
    
    }
    

    接下来,使用 UITextFieldDelegate 来跟踪文本字段中的任何更改,例如:

    func textFieldDidEndEditing(_ textField: UITextField) {
         let tableRow = textField.tag
         secondRowText[tableRow] = textField.text
    } 
    

    注意在 cellForRow() 中设置的 textField 标签现在如何用于知道 textField 在表格中的哪一行。

    【讨论】:

    • 我在哪里可以得到indexPath.row intextFieldDidEndEditing?或者您的意思是在tableRow 上替换indexPath.row
    • 但这对我没有帮助:(
    • 是的,在 textFieldDidEndEditing 中用 'tableRow' 替换 'indexPath.row'(编辑已提交)。 indexPath.row 在创建单元格时保存为 'rubHourTF.tag',然后用作 secondRowText 数组索引以在 textFieldDidEndEditing 中设置数据源中的文本值。
    【解决方案3】:

    你可以为你的单元制定一个委托协议

    protocol cellDelegate {
    func buttonClicked(textFieldText: String)}
    

    并在您的单元格中为您的协议创建一个变量

    var delegate: cellDelegate?
    

    然后在按钮点击事件中调用变量中的方法

    delegate?.buttonClicked(textFieldText: "string you got from textField")
    

    并在您的 table view cellForRowAt indexPath 方法中设置单元格的委托,如下所示:cell.delegate = self

    【讨论】:

    • 我不明白如何从我的三个 TextField 中获取三个文本
    • 在不同的单元格中?
    • 是的,如果你看我的图片,我有三行,我需要从第 1 部分的行中获取所有三个文本
    • 如果 textfield.text != nil ,您可以创建一个字符串数组的静态变量并将其从您的单元格中附加到文本字段 textChange 事件中
    【解决方案4】:

    不需要标签

    @IBAction func saveBarButtonPressed(_ sender: Any) {
        var array = NSMutableArray()
        for subview in self.tableView.subViews {
             if subView.isKind(of: String(describing: SettingsHourlyRateCell.self)) {
                for sView in subview {
                   if sView.isKind(of: String(describing: UITextField.self)) {   
                     array.add(sView.text)
                }
              }
           }
        }
    }
    

    【讨论】:

    • 没有帮助我,self.tableViewController.view.subViews 行出错,我无法应用此
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2019-05-16
    相关资源
    最近更新 更多