微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于在视图控制器之间传递数据的初学者问题

如何解决关于在视图控制器之间传递数据的初学者问题

我正在尝试在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 举报,一经查实,本站将立刻删除。