Domanda per principianti sul passaggio di dati tra i controller di visualizzazione
Sto cercando di ricreare l'app Notes in iOS. Ho creato un controller di visualizzazione iniziale che è solo una vista tabella. Un utente può accedere a un controller di visualizzazione dei dettagli per comporre una nuova nota con una sezione Titolo e Corpo. Quando fanno clic su Fine, voglio manipolare tableView con i dettagli della nota.
Sto lottando per salvare i dettagli di ciò che l'utente ha inserito per utilizzare sul mio controller di visualizzazione iniziale.
Ecco la mia classe Notes che definisce i dati delle note:
class Notes: Codable {
var titleText: String?
var bodyText: String?
}
Ecco il controller Detail View in cui un utente può inserire i dettagli della nota:
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)
}
}
}
Ho anche un array sul mio controller di visualizzazione iniziale. Penso di aver bisogno di questo per memorizzare i dati delle note da visualizzare in tableView (e forse non ho bisogno di quello sul mio controller Detail View?). Il tableView ovviamente non è ancora completamente implementato.
class ViewController: UITableViewController {
var noteArray = [Notes]()
override func viewDidLoad() {
super.viewDidLoad()
print(noteArray)
self.navigationItem.setHidesBackButton(true, animated: true)
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .compose, target: self, 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
}
Risposte
Usando semplicemente Delegate: prima crea un protocollo delegato con una funzione per inviare una nota al tuo viewController
protocol DetailViewControllerDelegate: AnyObject {
func newNoteDidAdded(_ newNote: Note)
}
Quindi aggiungi la variabile delegata a DetailViewController e chiama func noteDataDidUpdate per inviare i dati a viewController
class DetailViewController: UIViewController {
weak var delegate: DetailViewControllerDelegate?
@objc func updateNote() {
....
delegate?.newNoteDidAdded(newNote)
}
}
infine, imposta la variabile delegata su viewController e implementala in 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
}
}