swift - 从另一个 TableView 添加行 - Swift

标签 swift string tableview segue protocols

我正在尝试这样做,以便当我单击 listtableviewcontroller 上的数组中的一项时,它会将这一选择传递给 dataaddedtableviewcontroller 并附加该选择,以便我可以继续添加到列表中。 Storyboard

我尝试使用协议(protocol)和委托(delegate)传递数据,但是传递的只是整个列表本身(我认为这主要是因为我使用了按钮而不是单击单元格,因为我不知道如何否则)。我还尝试使用 segues 传递数据,但是一旦单击单元格,我似乎无法附加数据。

任何帮助将不胜感激。非常感谢!

第一个 View Controller :

protocol ListTableViewControllerDelegate {
    func addNew(todo: String)
}

class ListTableViewController: UITableViewController {

    var delegate: ListTableViewControllerDelegate?

    var list = ["chicken", "phone", "water"]

    @IBAction func saveToList(_ sender: Any) {
        delegate?.addNew(todo: "\(list)")
        navigationController?.popToRootViewController(animated: true)
    }



    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return list.count
    }

}

第二个 View Controller :

class DataAddedTableViewController: UITableViewController, ListTableViewControllerDelegate {

    var dataAdded = [String]()

    func addNew(todo: String) {
        dataAdded.append(todo)
        tableView.reloadData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of rows
        return dataAdded.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        cell.textLabel?.text = dataAdded[indexPath.row]
        return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destVC = segue.destination as? ListTableViewController {
            destVC.delegate = self as ListTableViewControllerDelegate

        }
    }

}

最佳答案

您需要找出用户点击的列表项的索引。目前您刚刚传递了整个列表。该行需要调整:

之前:

@IBAction func saveToList(_ sender: Any) {
   delegate?.addNew(todo: list)
   navigationController?.popToRootViewController(animated: true)
}

之后:

@IBAction func saveToList(_ sender: Any) {
    let index = CODE_NEEDE_HERE //figure out how to find out the index of the list
    delegate?.addNew(todo: list[index])
    navigationController?.popToRootViewController(animated: true)
}

我猜你有充分的理由不使用委托(delegate)方法 tableView(_:didSelectRowAt:)

使用tableView(_:didSelectRowAt:)解决方案可能是这样的:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let item = list[indexPath.row]
    delegate?.addNew(todo: item)
}

关于swift - 从另一个 TableView 添加行 - Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49835809/

相关文章:

Javascript 将数组连接到字符串

ios - swift 3 : Back gesture

android - “java.lang.String”在 Android 中已弃用

string - 通过返回分配的字符串导致内存泄漏

swift - 带有自定义单元格按钮、索引路径的 TableView

swift - 无法分配值: Function call returns immutable value

swift - 如何使用可变数据源在 TableView 中按字母顺序制作节标题

swift - 如何像在 Measure 应用程序中一样在 ARKit (SceneKit) 中绘制虚线?

ios - 在新 View Controller 上加载内容

Swift TableView 单元格不适合 1 行