Görünüm denetleyicileri arasında veri aktarımı hakkında başlangıç ​​sorusu

Aug 19 2020

İOS'ta Notes uygulamasını yeniden oluşturmaya çalışıyorum. Sadece bir tablo görünümü olan bir ilk Görünüm Kontrolcüsü yarattım. Bir kullanıcı, Başlık ve Gövde bölümü olan yeni bir not oluşturmak için Ayrıntı Görünümü Denetleyicisine gidebilir. Bitti'yi tıkladıklarında, notun ayrıntılarıyla tableView'i değiştirmek istiyorum.

Kullanıcının ilk görüntüleme denetleyicimde kullanmak için girdiği ayrıntıların ayrıntılarını kaydetmekte zorlanıyorum.

İşte not verilerini tanımlayan Notes sınıfım:

class Notes: Codable {
    var titleText: String?
    var bodyText: String?
}

İşte bir kullanıcının Not ayrıntılarını girebileceği Ayrıntılı Görünüm denetleyicisi:

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)
        }
    }
}

Ayrıca ilk görünüm denetleyicimde de bir dizi var. TableView'da görüntülemek için not verilerini depolamak için buna ihtiyacım olduğunu düşünüyorum (ve belki de Detay Görünümü denetleyicimdeki birine ihtiyacım yok mu?). Tabi ki tableView henüz tam olarak uygulanmadı.

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
    }

Yanıtlar

goat_herd Aug 19 2020 at 10:12

Yalnızca Temsilci kullanarak: Önce notu viewController'ınıza geri göndermek için bir işleve sahip temsilci protokolü oluşturun

protocol DetailViewControllerDelegate: AnyObject {
    func newNoteDidAdded(_ newNote: Note)
}

Ardından delege değişkenini DetailViewController'a ekleyin ve verileri viewController'a geri göndermek için func noteDataDidUpdate'i çağırın

class DetailViewController: UIViewController {
    weak var delegate: DetailViewControllerDelegate?

    @objc func updateNote() {
        ....
        delegate?.newNoteDidAdded(newNote)
    }
}

son olarak, delege değişkenini viewController'a ayarlayın ve bunu ViewController'da uygulayın

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
    }
}