我经常发现自己在写"实用"类,这些类可以在整个项目中重复使用.

例如,假设我有一个"地址簿"视图.我可能想用我的通讯簿来 Select 谁收到了邮箱,或者谁被添加到会议请求中.

我会开发这个视图控制器,这样邮箱控制器和会议控制器都可以使用它,并带有某种回调机制,让调用者知道用户已完成从通讯簿中 Select 某人,或者他们已取消.

在这种情况下,基本上有四种(合理的)方法;

  • 在AddressBookController上创建"AddressBookDelegate"协议和相应的委托属性.然后使用协议中定义的消息传递结果(类似于UIActionSheetDelegate).

  • 在AddressBookController上创建"非正式的""AddressBookDelegate"协议和相应的委托属性,但委托属性的类型将为"id",并将在运行时使用"respondsToSelector:"判断委托是否实现了我们所需的方法(似乎大多数框架内容都开始这样做).

  • 向AddressBookController传递一个代表委托的id,以及两个SEL,它们指定用户 Select 用户或取消请求时要调用的方法.我看到的好处是;假设一个控制器同时支持发送邮箱和设置会议(我知道在本例中,这似乎是一个糟糕的设计……但可以想象一个更一般的情况,在这种情况下,这对于一个实用程序类来说似乎是完全合理的)——在这种情况下,您可以根据是否添加不同的SEL来传递AddressBookController将用户添加到邮箱,或将用户添加到会议...与iVar相比,这是一个巨大的改进,可以指示控制器的"状态".

  • 通过AddressBookController两个模块;一个在用户从通讯簿中 Select 某人时运行,另一个在用户取消请求时运行.

这些积木对我来说非常有用,而且非常优雅,我发现自己几乎对什么时候不使用它们感到困惑.

我希望StackOverflow社区中比我更有经验的成员能够帮助他们思考这个话题.

推荐答案

实现这一点的"传统"方法是使用协议.非正式协议是在@protocol被添加到语言中之前使用的,但那是在我的时代之前,至少在过go 几年里,非正式协议一直被禁止使用,特别是考虑到@optional说明符.对于通过两个SEL的"委托人",这似乎比宣布正式协议更难看,而且在我看来通常是不对的.块是非常新的(尤其是在iOS上),随着这些东西的发展,虽然我们还没有看到大量关于最佳try 和真实风格的文档/博客,但我喜欢这个 idea ,这似乎是块最适合的事情之一:整洁的新控制流 struct .

基本上,我想说的是,每一种方法在年龄上都是不同的,没有一种方法比上一种更好,除了风格,这显然是非常重要的,这也是为什么每一种方法都被创造出来的最终原因.基本上,用你觉得舒服的最新的东西,要么是块,要么是一个正式的协议,你的困惑很可能来自阅读冲突的来源,因为它们是在不同的时间写的,但随着时间的推移,很明显看到哪个取代了其他.

[Controller askForSelection:^(id selection){
  //blah blah blah
} canceled:^{
  //blah blah blah
}];

可能比定义两个额外的方法和它们的协议(正式或其他)或传递SEL并将其存储在IVAR中等要简洁得多.

Objective-c相关问答推荐

OCUnit 的单元测试示例

UIAlertView 按钮操作

如何更改 UIButton 的突出显示 colored颜色 ?

多个 WKWebView 之间的 Cookie 共享

改变 setContentOffset:animated: 的速度?

观察 UIDatePicker 的变化

避免NSArray 在被枚举时发生Mutations

UIWebView 不会zoom 内容以适应

Obj-C 中的多值枚举

为什么是 [object doSomething] 而不是 [*object doSomething]?

有没有办法更新单个 UITableViewCell 的高度,而无需重新计算每个单元格的高度?

'supportedInterfaceOrientations' 实现中的返回类型冲突: - 警告

如何从输入 IB 的 UILabel 文本中插入新行 \n?

架构 i386 clang 的重复符号

使用 respondsToSelector 时 suppress '...' is deprecated

Objective-c 协议前向声明

Instruments Allocations 跟踪用户定义类的对象的分配和解除分配

所有异常断点在模拟器上无缘无故停止

@package 指令在 Objective-C 中的作用是什么?

info.plist 中的Application Requires iPhone Environment键是什么意思?