如何解决如何将数据从视图控制器传递到另一个表视图?
我正在尝试克隆 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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。