1

这是一个关于约定/最佳实践的问题。假设您有两个视图控制器FooBar. Foo显示一个事物列表,每个事物都有一个与之关联的图像,Bar用于呈现。例如Foo,可能会显示一个人名列表,然后按下其中一个人名会显示该人使用Bar控制器的图片。所以Bar需要一条简单的信息Foo——在这种情况下,是要显示的图像。

我们可以通过两种方式获取图像Bar

i) 设置Foo为s 委托,使用我们定义Bar的某种协议,并且具有沿线的强制方法 ii) 在 上具有简单属性,例如,并在转到 之前设置了此属性。BarDelegateBarDelegate- (UIImage *)imageToPresent;
Bar@property (nonatomic, weak) UIImage *imageToPresent;FooBar

这两者有约定或首选方式吗?

我能说的最好的一点是,委托方法的优点是您可以明确说明需要一些东西Bar才能工作。当然,Foo可能会忘记将自己设置为Bars 委托,但如果Bar说 10 个必需的属性,现在仍然只有一个地方可以搞砸(忘记设置委托)而不是 10 个。只使用属性的好处是它使代码更简洁。我应该注意,我只对所讨论的属性在目标视图控制器的生命周期中保持不变的情况感兴趣。我知道,如果属性在整个生命周期中是变体的,并且目标视图控制器需要多次“查询”源视图控制器,那么委派可能会产生额外的吸引力。

4

1 回答 1

1

委托通常用于允许委托对象与主对象进行通信,以请求附加数据或执行回调。

在您的情况下,没有理由不立即为委托对象提供它所需的一切,因为您已经有了它,所以第二种选择将是最合理的方法。

一般来说,委托流程或多或少是这样的

Foo:“嗨,Bar,这是给你的任务。使用这些数据,做你的事”

[稍后的]

酒吧:“嘿老板,这件事刚刚发生!”
Foo:“哦,太好了!谢谢你让我知道”

[稍后的]

酒吧:“嘿老板,我需要更多的东西来完成这项工作”
Foo:“这里是”

[稍后的]

酒吧:“嘿老板,我完成了!这是我的工作成果”

自定义BazDelegate协议的定义适用于Baz需要回传的情况Foo(例如,用户在详细视图上执行了选择)。

在这种情况下,您通常会定义类似

@protocol BazDelegate
- (void)baz:(Baz *)baz didFinishSelectingWhatever:(id)whatever;
@end

然后实现它Foo以接收来自委托对象的有意义的回调。

于 2013-06-27T00:28:02.473 回答