我经常发现自己正在编写可以在我的项目中重复使用的“实用程序”类。目标C:模块与选择器与协议
例如,假设我有一个“地址簿”视图。我可能想要使用我的地址簿来选择发送电子邮件的人员,或者将其添加到会议请求中的人员。
我开发了这个视图控制器,以便电子邮件控制器和会议控制器都可以使用某种回调机制来让调用者知道用户是否从地址簿中选择了某人,或者他们取消了。
看来基本上有四种(合理的)方法可以在这种情况下使用;
在AddressBookController上创建一个“AddressBookDelegate”协议和相应的委托属性。然后使用协议中定义的消息来传递结果(类似于UIActionSheetDelegate)。
在AddressBookController上创建一个“非正式”AddressBookDelegate协议和一个相应的委托属性,但委托属性的类型为“id”,并在运行时检查“respondsToSelector:”以查看委托实现我们需要的方法(看起来像大多数框架的东西已经开始这样)。
传递AddressBookController一个表示委托的id,以及两个SEL,它们指定在用户选择用户或取消请求时调用的方法。我看到的好处是;假设一个控制器支持发送电子邮件和建立会议(在这个例子中,我知道这似乎是不好的设计......但可以想象一个更普遍的情况,这对于公共事业类似乎是完全合理的) - 在这种情况下,你可以根据您是否将用户添加到电子邮件中或将用户添加到会议中,传递AddressBookController不同的SEL ...对iVar的巨大改进来指示控制器的“状态”。
传递AddressBookController两个块;一个在用户从地址簿中选择某人时运行,另一个在用户取消请求时运行。
这些块对我来说非常有用,而且更加优雅,我发现自己几乎不知道什么时候不使用它们。
我希望有更多有经验的StackOverflow社区成员比我能帮助他们对这个主题的想法。
我希望人们对他们同意的现有答案投票。我会在几天内给出答案,谁拥有最多的选票。 – Steve 2010-08-03 02:12:20