这是关于惯例/最佳做法的问题。假设您有两个视图控制器Foo
和Bar
。 Foo
显示了一个事物列表,每个事物都有一个与之关联的图像Bar
用于呈现。例如。 Foo
可能会显示人名列表,按其中一个名称会使用Bar
控制器显示该人的图片。因此Bar
需要来自Foo
的简单信息 - 在这种情况下,是要显示的图片。
我们可以通过两种方式将图像转换为Bar
:
i)使用我们定义的某种Foo
协议将Bar
设置为BarDelegate
委托,并使BarDelegate
具有强制性方法- (UIImage *)imageToPresent;
1}}
ii)在Bar
上有一个简单的属性,例如@property (nonatomic, weak) UIImage *imageToPresent;
并Foo
设置此属性,然后再转到Bar
。
是否存在这两种惯例或首选方法?
最好的我可以说,委托方法的优点是你可以明确指出Bar
有一些工作要求。当然,Foo
可能会忘记将自己设置为Bar
委托,但如果Bar
已经说出10个必需属性,那么现在仍然只有一个地方可以搞乱(忘记设置委托)而不是10.仅使用属性的优点是它使代码更简洁。我应该注意到,我只对所讨论的属性在目标视图控制器的生命周期中不变的情况感兴趣。我理解,如果属性在整个生命周期中是变体的,并且目标视图控制器需要多次“查询”源视图控制器,那么委托可能会有额外的吸引力。
答案 0 :(得分:1)
委托通常用于允许委托对象与主对象进行通信,以获取其他数据或执行回调。
在您的情况下,没有理由不立即为委托对象提供所需的一切,因为您已经可以使用它,因此第二种选择是最合理的方式。
一般来说,委托流程或多或少都像这样
Foo :“嗨吧,这是给你的任务。使用这些数据做你的事情”
[稍后]
酒吧:“嘿老板,这件事刚刚发生!”
Foo :“哦,太好了!谢谢你让我知道”[稍后]
酒吧:“嘿老板,我需要更多的东西来完成工作”
Foo :“这是”[稍后]
酒吧:“嘿老板,我已经完成了!这是我工作的结果”
自定义BazDelegate
协议的定义适用于Baz
需要与Foo
进行通信的情况(例如,用户在详细视图上执行了选择)。
在这种情况下,您通常会定义类似
的内容@protocol BazDelegate
- (void)baz:(Baz *)baz didFinishSelectingWhatever:(id)whatever;
@end
然后在Foo
中实现它以从委托对象接收有意义的回调。