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

How to pass data from a viewcontroller to another tableview?

我正在尝试克隆 iOS 笔记应用程序。我在将数据从 Viewcontroller 传回另一个 Tableviewcontroller 时遇到问题。 (此处从 EditorViewController 到 MainViewController)

我有一个带有文本和日期属性的注释 class。

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 应该将注释数据发送回上面的表视图。

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() {

     ...

    }

}

在编辑器中Viewcontroller 我有一个 textview ,我想将其中的文本保存为注释文本,并在我点击 saveNote 时将该注释加载到 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 委托在您的 EditorViewController class 中添加 weak var delegate: YourProtocolName,最后您需要修改 createNoteTapped MainViewController 中的函数将自身作为 EditorViewController 委托

传递
@objc func createNoteTapped(noteIndex: Int) {
        if let vc = storyboard?.instantiateViewController(identifier: "EditorViewController") as? EditorViewController {
            vc.delegate = self
            navigationController?.pushViewController(vc, animated: true)
        }
    }