【问题标题】:Passing data around with delegation通过委托传递数据
【发布时间】:2015-12-21 21:27:08
【问题描述】:

我试图了解委托在传递数据方面的工作方式。我认为以下两种说法都是正确的:

UITableView 示例

UITableView 对象定义了UITableViewDelegateUITableViewDataSource 的协议,并且委托可以符合这些协议。例如,如果您在 UIViewController 中有一个 UITableView 实例,人们通常会使 UIViewController 符合 UITableViewDataSource,在这种情况下,UIViewControllerUITableView。在此范例中,委托将数据发送回UITableView

UIViewController 示例

我们经常需要在UIViewControllers 之间传递数据。一种方法是定义两个UIViewControllers 之间的委托关系。我们可能有一个ParentViewController 和一个ChildViewController,我们希望将数据从ChildViewController 发送到ParentViewController。为了设置它,我们在ChildViewController 中定义一个protocol 并添加一个委托属性,例如:@property (weak) id <SendDataToParent> delegate;。然后,如果我们使用 segue,我们可能会执行以下操作:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"childvc"]) {
        self.childVC = (ChildViewController *)segue.destinationViewController;
        self.childVC.delegate = self;
    }
}

然后当ChildViewController中发生某些事件时,我们调用[delegate sendData];或类似的方法。在此示例中,我们将数据从委托类传递给委托。

这两种都是在 Objective-C 中实现委托关系的好方法吗?

【问题讨论】:

  • 第二个是的,第一个我会说只是部分。第一个是关于UITableViewDelegate 的“经典”委托模式的混合,但DataSource 更可能是ModelViewController 模式的一部分(尽管使用了委托)。我不建议对这些模式进行绝对的思考。只是我的 2 美分,不要把其中的任何一点都当作某些事实,因为我喜欢使用这些模式,而不是知道每一个正确的技术理论术语;)
  • 第一个中的DataSource有点不同,但是还有一个UITableViewDelegate。

标签: ios objective-c delegates


【解决方案1】:

我认为第一个示例是委托模式的主要原因。它源于实现委托模式的对象应该是可重用的并且完全与上下文无关的想法,因此根本不需要子类化就可以使用。例如,表格视图没有关于它所在的应用程序的上下文。基本上它对代表说 - “嘿,给我在第 xx 行显示的东西”或“嘿,第 yy 行被点击了,我应该突出显示它吗?” .对我来说,这是实现不需要子类化以在不同应用程序中承担不同功能的可重用对象的好方法。例如更复杂的 UI 元素。

在第二个示例中,需要在一个应用中的两个自定义类之间进行通信,这也是一个典型的场景。显然,要做到这一点,他们需要就要发送的消息达成一致,并相互参考。原则上,这就像两个类之间的任何其他消息接口一样,我认为在大多数情况下,没有必要使用委托模式使其复杂化。但是,如果意图是子视图控制器可以重用并且发现自己是不同父视图控制器类的子视图,那么具有定制协议的委托模式再次有意义。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    相关资源
    最近更新 更多