Ios 通过委托传递数据

Ios 通过委托传递数据,ios,objective-c,delegates,Ios,Objective C,Delegates,我试图理解在传递数据方面,委托是如何工作的。我认为以下两种说法都是正确的: UITableView示例 UITableView对象为UITableViewDelegate和UITableViewDataSource定义协议,并且委托可以遵守这些协议。例如,如果在UIViewController中有一个UITableView实例,人们通常会使UIViewController符合UITableViewDataSource,在这种情况下,UIViewController是UITableView的委托。

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

UITableView示例

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

UIViewController示例

通常我们需要在
UIViewControllers
之间传递数据。一种方法是定义两个
UIViewController
之间的委托关系。我们可能有一个
ParentViewController
和一个
ChildViewController
,我们希望将数据从
ChildViewController
发送到
ParentViewController
。为了进行设置,我们在
ChildViewController
中定义了
协议
,并添加了一个委托属性,比如:
@property(弱)id 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中实现委托关系的好方法吗?

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


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

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