【问题标题】:Delegate multiple view controllers委托多个视图控制器
【发布时间】:2017-07-26 10:04:51
【问题描述】:

我有连接到 2 个视图控制器的主视图控制器。 我在有 didRecive(data:Data) 委托函数的地方制定了协议。

protocol MainViewControllerDelegate: class {
func didReciveDepartment(response:DepartmentResponse)

}

在主视图控制器中,我声明了委托变量。

    weak var delegate: DepartmentMainViewControllerDelegate?

在为 segue 做准备时,我将此委托设置为 viewCotnroller 的。像这样-

        if segue.identifier == "productsEmbedded" {
        let vc = segue.destination as! DepartmentProductsViewController
        delegate = vc


    }
    if segue.identifier == "shopsEmbedded" {
        let vc = segue.destination as! DepartmentShopsViewController
        vc.delegate = self
        delegate = vc
    }

我在 DepartmentShopsViewController 中只有有线行为委托触发器,而 DepartmentProductsViewController 无法获得此委托,我注释掉了商店和产品获得了此委托,所以这意味着我不能为 2 个控制器使用相同的委托?

【问题讨论】:

  • 你想有一个单独的变量....如何将两个对象保存在同一个变量中
  • 刚刚做了第二个代表 var 并没有工作。
  • productsEmbedded segue 中的`delegate = vc` 是什么?
  • 你还得给第二个代表打电话……
  • 您在哪里创建了协议?以及哪个控制器设置了委托?

标签: ios swift cocoa


【解决方案1】:

这些是在对象之间传递消息的多种方式。您可以使用 Delegate 和 NSNotificationCentre 传递数据。主要区别在于委托,一个指定的对象接收消息,而 任何数量的对象都可以在发布时收到通知。 您可以查看this之前的SO ques了解详情。

【讨论】:

  • 错了,这两个视图控制器作为容器连接到 main 上,当 MainViewController 被初始化时,我只使用了一次 preapreForSegue。在那里我设置了这些委托,以及从这些视图控制器到主控制器的委托,以建立它们之间的通信。
  • 请说明您如何在 MainViewController 中获取数据??
  • 我通过 preapreForSegue 从之前的控制器中传递了它,它存在 MainViewController,后来我只是从 MainViewController 内部的函数中更新了这些数据。
  • 你能告诉我你在哪里定义了协议 DepartmentMainViewControllerDelegate 吗??
  • 检查我刚刚删除部门信函的问题。它在 DepartmentMainViewController 类中定义。
【解决方案2】:

来吧,伙计,你忘了一行

    vc.delegate = self        

代码应该是这样的

if segue.identifier == "productsEmbedded" {
    let vc = segue.destination as! DepartmentProductsViewController
    vc.delegate = self     //Add this Line   
    delegate = vc
}
if segue.identifier == "shopsEmbedded" {
    let vc = segue.destination as! DepartmentShopsViewController
    vc.delegate = self
    delegate = vc
}

【讨论】:

  • 错了,检查问题我在一个控制器中拥有所有这个东西的委托触发器。和 vc.delgate 在 DepartmentsShops 上,因为我有 DepartmentShopsDelegatei,这是一个不同的故事。
【解决方案3】:

对于 Delegate,您必须这样实现

//Declare protocol
protocol MainViewControllerDelegate {
    func didReciveDepartment(response:DepartmentResponse)
}

class DepartmentProductsViewController: UIViewController {

    // MARK: - Variable Declaration.
    var delegate: MainViewControllerDelegate?

}

class DepartmentShopsViewController: UIViewController {

    // MARK: - Variable Declaration.
    var delegate: MainViewControllerDelegate?

}

class  MainViewController: UIViewController, MainViewControllerDelegate {

    //Push ViewController with segue and  use delegate property
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "productsEmbedded"{

            let vc = segue.destination as! DepartmentProductsViewController
            vc.delegate = self
        } else if segue.identifier == "shopsEmbedded" {

            let vc = segue.destination as! DepartmentShopsViewController
            vc.delegate = self
        }
    }

    //MARK: Implement MainViewControllerDelegate Methods.
    func didReciveDepartment(response: DepartmentResponse) {

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-12
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多