我正在尝试了解委托如何处理传递数据。我认为以下两个陈述都是正确的:
UITableView示例
UITableView
对象定义了UITableViewDelegate
和UITableViewDataSource
的协议,并且委托可以符合这些协议。例如,如果UITableView
中有UIViewController
个实例,则人们通常会UIViewController
符合UITableViewDataSource
,在这种情况下,UIViewController
是< UITableView
的强>代理。在此范例中,委托将数据发送回UITableView
。
UIViewController示例
我们经常需要在UIViewControllers
之间传递数据。一种方法是在两个UIViewControllers
之间定义委托关系。我们可能有ParentViewController
和ChildViewController
,我们希望将数据从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中实现委托关系的好方法吗?
答案 0 :(得分:0)
我看到第一个例子的方式是委托模式的主要原因。它来自于实现委托模式的对象应该是可重用的并且完全不依赖于上下文的想法,因此根本不需要子类化是有用的。例如,表视图没有关于它所在的应用程序的上下文。基本上它对代表说 - “嘿,给我显示在行xx中的东西”或“嘿,行yy被点击了,我应该突出显示它吗?” 。对我来说,这是一种实现可重用对象的好方法,这些对象不需要子类化来在不同的应用程序中承担不同的功能。例如,更复杂的UI元素。
在第二个示例中,需要在应用程序中的两个自定义类之间进行通信,这也是典型的场景。显然,他们需要就要发送的消息达成一致并相互引用。原则上,这就像两个类之间的任何其他消息传递接口一样,我认为在大多数情况下,不需要使用委托模式使其复杂化。但是,如果意图是子视图控制器可以重用并且发现自己是不同父视图控制器类的子节点,则具有定制协议的委托模式再次有意义。