使用委派

时间:2015-12-21 21:27:08

标签: ios objective-c delegates

我正在尝试了解委托如何处理传递数据。我认为以下两个陈述都是正确的:

UITableView示例

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

UIViewController示例

我们经常需要在UIViewControllers之间传递数据。一种方法是在两个UIViewControllers之间定义委托关系。我们可能有ParentViewControllerChildViewController,我们希望将数据从ChildViewController发送到ParentViewController。要进行此设置,我们会在protocol中定义ChildViewController并添加委托属性,例如:@property (weak) id <SendDataToParent> delegate;。然后,如果我们使用segues,我们可能会做类似的事情:

- (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中实现委托关系的好方法吗?

1 个答案:

答案 0 :(得分:0)

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

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