编辑单元格内的文本视图后,将另一个单元格添加到表视图

时间:2019-01-08 23:04:16

标签: ios swift uitableview

我想以我不使用情节提要的事实作为开头。

我有一个包含多个部分的tableview,这些部分充满了我以编程方式创建的tableViewcells。这些自定义单元格包括带有某些占位符文本的文本字段。我希望用户能够执行的操作是点击文本字段,键入他们的条目,然后按“ Enter”以关闭键盘,然后在刚编辑的单元格下面创建一个新单元格。这与提醒应用程序中发生的行为非常相似。

我很难弄清楚如何访问tableview的数据模型(数组)并弄清楚该单元格位于哪个部分,将新字符串添加到数组,然后添加另一个杜比单元格带有占位符文本。

1 个答案:

答案 0 :(得分:1)

首先,您必须创建一种在单元格和视图控制器之间进行通信的方法。 您可以为此使用委托模式或回调。 例如:

final class TextFieldCell: UITableViewCell {

    // MARK: - IBOutlets
    @IBOutlet weak var textField: UITextField!

    // MARK: - Local variables
    var callback: ((_ text: String) -> Void)?

    // MARK: - Lyfecycle
    override func awakeFromNib() {
        super.awakeFromNib()
        textField.delegate = self
    }
}

也不要忘记调用我们的回调:

extension TextFieldCell: UITextFieldDelegate {
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        textField.resignFirstResponder()
        callback?(textField.text!)
        return true
    }
}

太好了!现在我们将字符串从单元格发送到控制器!

用于视图控制器(简化版)的代码示例:

class ViewController: UIViewController {
    // MARK: - IBOutlets
    @IBOutlet weak var tableView: UITableView!

    // MARK: - Local variables
    var titles = ["Hello", "world"]
}

// MARK: - UITableViewDataSource

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return titles.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let textFieldCell = tableView.dequeueReusableCell(withIdentifier: "textFieldCell", for: indexPath) as! TextFieldCell

        textFieldCell.textField.placeholder = titles[indexPath.row]
        textFieldCell.callback = { [weak self] newTitle in // don't forget about memory leaks
            guard let `self` = self else { return }

            // calculating index path for new row
            let newIndexPath = IndexPath(row: indexPath.row + 1, section: indexPath.section)

            // appending a new row in table view
            self.titles.append(newTitle)
            self.tableView.insertRows(at: [newIndexPath], with: UITableView.RowAnimation.automatic)
        }

        return textFieldCell
    }
}