簡體   English   中英

如何在容器視圖和主視圖控制器之間正確傳遞數據

[英]How to pass data between container view and main view controller properly

我正在處理以下問題:在主VC上,我有一個TableView,在容器視圖控制器上,我有一個textField。 我想添加所有文本,我在容器中輸入內容會自動顯示為主VC中tableView上的新行

現在,我正在使用segue將數據從主VC發送到容器。 但是,我應該怎么做才能以相反的順序執行相同的操作? 雖然我在容器視圖中實現了主要VC的委托,但是我不知道如何正確執行。 或者,也許存在更常見的解決方案。

無論如何,這是我的代碼:

class MessageViewController: UIViewController {

    var currentUser: User!

    var containerViewController: InputTextViewController?

    @IBOutlet weak var enterMessageView: UIView!
    @IBOutlet weak var messageTableView: UITableView!
}

extension MessageViewController {

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "moveToInputText" {
            let connectContainerViewController = segue.destination as? InputTextViewController
            containerViewController = connectContainerViewController

            containerViewController?.userSendMessageTo = currentUser

        }
    }
}

extension MessageViewController: UITableViewDelegate, UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return currentUser.mesaageHistory.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "messageCell") as! ChatMessageTableViewCell
        let data = currentUser.mesaageHistory[indexPath.row]
        cell.messageLabel.text = data.messageText

        return cell
    }
}

class InputTextViewController: UIViewController {

    @IBOutlet weak var messageTextField: UITextField!

    var userSendMessageTo: User!

    weak var delegate = MessageViewController()

    @IBAction func sendMessge(_ sender: Any) {

        handleSend()
        userSendMessageTo.mesaageHistory.append(message)

        print(userSendMessageTo.mesaageHistory[0].messageText)

        let row = userSendMessageTo.mesaageHistory.count - 1
        let insertIndexPath = IndexPath(item: row, section: 0)

        print(userSendMessageTo.mesaageHistory.count)

        delegate?.messageTableView.beginUpdates()
        delegate?.messageTableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.automatic)
        delegate?.messageTableView.endUpdates()

    }

}

這是正確使用“委托”模式的方法

  1. 協議聲明和委托成員

     protocol InputTextViewControllerDelegate: class { func someFunc() func anotherFunc() } class InputTextViewController: UIViewController { weak var delegate: InputTextViewControllerDelegate? } 
  2. 協議實現和設置委托屬性

     extension MessageViewController, InputTextViewControllerDelegate { // MARK: InputTextViewControllerDelegate // func someFunc() { } func anotherFunc() { } override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if segue.identifier == "moveToInputText" { let connectContainerViewController = segue.destination as? InputTextViewController containerViewController = connectContainerViewController containerViewController } } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM