在单独的ViewController中编辑tableView条目,将编辑后的数据传递回tableView

时间:2017-04-29 09:18:22

标签: arrays swift uitableview segue

我正在编写日记应用程序。因此,我在tableView中列出了所有条目。一个日记条目包括标题,日期,类别,实际上日记内容为字符串。

所有条目都存储在这样的数组中:

var array = [Einträge] ()

要编辑一个条目,一个条目的数据将传递给" DetailViewController"通过点击tableView中的条目。我目前能够更改不同的数据,但我无法将更改的数据传回我的tableView。

为了显示DetailViewController中的条目,使用了一个segue:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let identifier = segue.identifier {
        switch identifier {
            case "AddEintragSegue":
                let destVC = segue.destination as! AddEintragViewController
                destVC.delegate = self
            case "Show Detail":
                let dVC = segue.destination as! DetailViewController
                if let indexPath = self.tableView.indexPath(for: sender as! UITableViewCell) {
                    dVC.eintrag = array[indexPath.row]
            }
        default: break
        }
    }

要保存更改,必须按此按钮。我应该在以下代码中添加什么?

@IBAction func btnSafeChanges(_ sender: Any) {

    eintrag = Einträge(name: txtTitel.text!, inhalt: txtInhalt.text!, datum: txtDatum.text!, kategorie: txtKategorie.text!)

或者我应该使用其他类型的segue?

1 个答案:

答案 0 :(得分:0)

您可以与某位代表一起将数据传回

import UIKit

struct Einträge {}

protocol DetailViewControllerDelegate: class {
    func newEintragCreated(eintrag: Einträge, index: Int)
}

final class InitialViewController: UIViewController {

    var array: [Einträge] = []
    let tableView = UITableView()

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let identifier = segue.identifier {
            switch identifier {
            case "Show Detail":
                let dVC = segue.destination as! DetailViewController
                if let indexPath = self.tableView.indexPath(for: sender as! UITableViewCell) {
                    dVC.eintrag = array[indexPath.row]
                    dVC.index = indexPath.row
                    dVC.newEintragDelegate = self
                }
            default:
                break
            }
        }
    }
}

extension InitialViewController: DetailViewControllerDelegate {

    func newEintragCreated(eintrag: Einträge, index: Int) {
        // replace old object for newly created one
        array[index] = eintrag
        tableView.reloadData()
    }
}

final class DetailViewController: UIViewController {

    var eintrag: Einträge!
    var index: Int?
    weak var newEintragDelegate: DetailViewControllerDelegate?

    func btnSafeChanges() {
        let eintrag = Einträge()
        if let index = index, let delegate = newEintragDelegate {
            delegate.newEintragCreated(eintrag: eintrag, index: index)
        }
    }
}