【发布时间】:2013-02-05 01:56:41
【问题描述】:
让我们考虑一个具有高度自定义或复杂视图的应用程序。
我们将有一种特定类型的视图控制器向特定类型的 UIView 发送方法,其中 UIView 本身由许多其他视图组成。
视图应该有一个丰富的、特定于域的接口,允许控制器行动是它和一个同样丰富的模型之间的薄“胶水”层。
所以我们重写控制器的视图属性如下:
@interface PlaybackViewController : UIViewController<StageLayoutDelegate, ControlPanelDelegate>
{
NSMutableArray* _sections;
LightingMode _lightingMode;
}
@property (nonatomic, strong) PlaybackView* view; // <------ Specific type of view
#pragma mark - injected
@property (nonatomic, strong) id<OscClient> oscClient;
@property (nonatomic, strong) AbstractStageLayoutView* stageLayoutView;
@end
覆盖比定义另一个访问器更有意义,我可以将消息发送到特定类型的 UIView 而无需强制转换。
问题:唯一的问题是它会导致编译器警告:
属性类型“PlaybackView *”与继承自“UIViewController”的类型“UIView *”不兼容
。 .我喜欢构建没有任何警告的代码。这样,一个有效的警告就不会被埋在其他警告中而错过。
问题:
- 有没有办法抑制这个特殊的警告?
- 为什么这部分是默认设置,而大多数现代 OO 语言会很高兴地允许覆盖子类中的属性或方法,以便返回在超类中声明的类型的更具体的子类?
【问题讨论】:
-
你为什么不创建一个视图子类并将主 VC 视图用作容器?苹果建议总是组合子类
-
UITableViewController 设法做你正在谈论的事情,因此它不灵活到几乎没用的地步。我会认真考虑这种方法。它可能稍后会回来咬你。
-
这是一个快速而肮脏的方法,只是为了抑制警告,尝试在这些行之间包装你的代码
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wgnu" //YOUR CODE #pragma clang diagnostic pop或 -Wall -
@JasperBlues 我已经编辑了我的答案,但当然,之前尝试过。
-
@KirbyTodd 我同意 UITableViewController 的用途有限,但我不认为它是因为它与 UITableView 紧密耦合。 .在许多情况下,视图控制器与特定类型的视图交互。 .这样做有助于控制器承担其作为丰富视图和模型之间的薄粘合层的预期角色。
标签: ios objective-c cocoa-touch