如何将数据从视图控制器传递到另一个表视图?

问题描述

我正在尝试克隆 iOS Note App。我在将数据从 Viewcontroller 传递回另一个 Tableviewcontroller 时遇到问题。 (这里从 EditorViewController 到 MainViewController)

我有一个带有 Text 和 Date 属性的 Note 类。

class Note: Codable {
    var text: String
    var modificationDate: Date
    
    init(text: String,modificationDate: Date) {
        self.text = text
        self.modificationDate = modificationDate
    }
}

表视图:

class MainViewController: UITableViewController {
    
    var notes = [Note]()

    @objc func createNoteTapped(noteIndex: Int) {
        if let vc = storyboard?.instantiateViewController(identifier: "EditorViewController") as? EditorViewController {
            navigationController?.pushViewController(vc,animated: true)
        }
    } 
    
    override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
        return notes.count
    }
    
    override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        ...  
    }
}
    

和 ViewController 应该将 Note 数据发送回上面的 tableview。

class EditorViewController: UIViewController {
    
    var notes: [Note]!
    var noteIndex: Int!

    @IBOutlet var textView: UITextView!
    
    func setParameters(notes: [Note],noteIndex: Int) {
        self.notes = notes
        self.noteIndex = noteIndex
        notes.append(notes[noteIndex])
    }
    
    @objc func saveNote() {

     ...

    }

}

在 EditorViewcontroller 中,我有一个 textview ,我想将其中的文本保存为 Note 文本,然后在点击 saveNote 时将该 Note 加载到 TableView 中。我真的被困住了,我应该如何编写 saveNote 函数来做到这一点?感谢您的帮助。

解决方法

您可以使用 delegate pattern 来回传递数据,而不是使用 closures

在你的 EditorViewController 中创建回调闭包

class EditorViewController: UIViewController {

        var onCompletion: ((notes: [Note]) -> ())?
        var notes: [Note]!
        var noteIndex: Int!

在您的保存笔记操作中,将完成部分中保存的数据设置为类似

@IBAction func saveNote() {
    onCompletion?(notes: notes)
            self.navigationController?.popViewController(animated: true)

}

最终像这样在 MainViewController 上处理您的数据

   @objc func createNoteTapped(noteIndex: Int) {
    if let vc = storyboard?.instantiateViewController(identifier: "EditorViewController") as? EditorViewController {
         vc.onCompletion = { notes in
        // this will be executed when `saveNote(_:)` will be called
        print(notes)
        // refresh your tableview
    }
        navigationController?.pushViewController(vc,animated: true)
    }
} 
,

正如我在评论中所说,您可以创建一个 protocol 以将 Note 数组传递给您的 MainViewController

protocol YourProtocolName {
    func updatedNotes(notes: [Note])
}

那么你的MainViewController需要实现这个协议

extension MainViewController: YourProtocolName {
   func updatedNotes(notes: [Note]) {
      //Do whatever you need to do here
   }
}

在此之后,您需要将 MainViewController 声明为 EditorViewController 委托,在 weak var delegate: YourProtocolName 类中添加 EditorViewController,最后您需要修改 createNoteTapped 中的函数{1}} 将 self 作为 MainViewController 委托传递

EditorViewController