如何在容器视图和主视图控制器之间正确传递数据

Posted

技术标签:

【中文标题】如何在容器视图和主视图控制器之间正确传递数据【英文标题】:How to pass data between container view and main view controller properly 【发布时间】:2017-03-26 06:17:32 【问题描述】:

我正在处理以下问题:在主 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?
    
    

    协议实现&设置委托属性

    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
    
       
      
    
    

【讨论】:

以上是关于如何在容器视图和主视图控制器之间正确传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在视图控制器之间移动和传递数据的正确方法

如何快速将数据从视图控制器传递到容器视图

UITableView 在嵌入在容器中的控制器之间传递数据

如何在视图控制器之间传递数据 - 不起作用

如何在由 UITabBarController 分隔的两个视图控制器之间传递数据?

swift 4 中使用 performSegue 打开的关闭页面时,如何在视图控制器和 TableViewController 之间传递数据?