如何将数据从 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)
}
}
我正在尝试克隆 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)
}
}