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

Posted

技术标签:

【中文标题】在单独的 ViewController 中编辑 tableView 条目,并将编辑后的数据传回 tableView【英文标题】:Edit a tableView entry in a separate ViewController an pass back the edited data into the tableView 【发布时间】:2017-04-29 09:18:22 【问题描述】:

我目前正在编写一个日记应用程序。因此,我将所有条目都列在 tableView 中。一个日记条目由标题、日期、类别和实际上作为字符串的日记内容组成。

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

var array = [Einträge] ()

要编辑一个条目,通过点击 tableView 中的条目,将一个条目的数据传递给“DetailViewController”。我目前能够更改不同的数据,但我无法将更改后的数据传回我的 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】:

您可以与一些委托人一起将数据传回

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)
        
    

【讨论】:

以上是关于在单独的 ViewController 中编辑 tableView 条目,并将编辑后的数据传回 tableView的主要内容,如果未能解决你的问题,请参考以下文章

如何在单独的 ViewController 中在 iOS 中制作弹出/对话框视图?

从标签栏控制器打开带有后退按钮的单独 ViewController

C#:在winform上使用定时器来改变图表,定时器需要单独的方法,图表数据不能从单独的方法中编辑

Swift 2 - 无法在单独的 ViewController 中加载 UIWebView

你如何将数据从 ViewController 传递到包含单独 ViewController 的 PageViewController,然后这些 ViewController 将使用这些数据?

如何在使用它的 ViewController 上调整自定义(在单独的文件中创建)UIView 高度?