如何解决关于在视图控制器之间传递数据的初学者问题
我正在尝试在iOS中重新创建Notes应用。我创建了一个初始的View Controller,它只是一个表视图。用户可以转到“详细视图控制器”来撰写带有“标题和正文”部分的新笔记。当他们单击“完成”时,我想用注释的详细信息来操纵tableView。
我正在努力将用户输入的详细信息保存在我的初始视图控制器上。
这是我的Notes类,用于定义注释数据:
class Notes: Codable {
var titleText: String?
var bodyText: String?
}
这是“详细信息视图”控制器,用户可以在其中输入注释详细信息:
class DetailViewController: UIViewController {
@IBOutlet var noteTitle: UITextField!
@IBOutlet var noteBody: UITextView!
var noteDetails: Notes?
var noteArray = [Notes]()
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done,target: self,action: #selector(updateNote))
noteTitle.borderStyle = .none
}
@objc func updateNote() {
noteDetails?.titleText = noteTitle.text
noteDetails?.bodyText = noteBody.text
noteArray.append(noteDetails!) // This is nil
// not sure if this is the right way to send the details over
// let vc = ViewController()
// vc.noteArray.append(noteDetails!)
if let vc = storyboard?.instantiateViewController(identifier: "Main") {
navigationController?.pushViewController(vc,animated: true)
}
}
}
我的初始视图控制器上也有一个数组。我想我需要这个来存储要在tableView中显示的笔记数据(也许不需要在我的Detail View控制器上呢?)。 tableView显然尚未完全实现。
class ViewController: UITableViewController {
var noteArray = [Notes]()
override func viewDidLoad() {
super.viewDidLoad()
print(noteArray)
self.navigationItem.setHidesBackButton(true,animated: true)
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .compose,action: #selector(composeNote))
}
@objc func composeNote() {
if let dvc = storyboard?.instantiateViewController(identifier: "Detail") as? DetailViewController {
navigationController?.pushViewController(dvc,animated: true)
}
}
override func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int {
noteArray.count
}
override func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell",for: indexPath)
return cell
}
解决方法
只需使用委托: 首先使用func创建委托协议,以将笔记发送回viewController
protocol DetailViewControllerDelegate: AnyObject {
func newNoteDidAdded(_ newNote: Note)
}
接下来,将委托变量添加到DetailViewController,并调用func noteDataDidUpdate将数据发送回viewController
class DetailViewController: UIViewController {
weak var delegate: DetailViewControllerDelegate?
@objc func updateNote() {
....
delegate?.newNoteDidAdded(newNote)
}
}
最后,将委托变量设置为viewController并在ViewController中实现
class ViewController: UIViewController {
....
@objc func composeNote() {
if let dvc = storyboard?.instantiateViewController(identifier: "Detail") as? DetailViewController {
dvc.delegate = self
navigationController?.pushViewController(dvc,animated: true)
}
}
}
extension ViewController: DetailViewControllerDelegate {
func newNoteDidAdded(_ newNote: Note) {
// do some thing with your new note
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。