如何覆盖UIViewController中的"view"属性?

Kei*_*ald 28 iphone cocoa-touch uiviewcontroller uiview

我有一个自定义UIViewController和自定义UIView.我想重写viewcontroller.view属性以返回MyCustomUIView.

现在我有:

@interface MyViewController : UIViewController {    
    IBOutlet MyView* view;
}

@property (nonatomic, retain) IBOutlet MyView* view;
Run Code Online (Sandbox Code Playgroud)

这个编译但是我得到一个警告:属性'view'类型与超类'UIViewController'属性类型不匹配.

我该如何缓解此警告?

Jos*_*phH 23

@ lpaul7已经发布了一个链接到Travis Jeffery的博客作为评论,但它比所有其他答案更正确,它确实需要代码作为答案:

ViewController.h:

@interface ViewController : UIViewController

@property (strong, nonatomic) UIScrollView *view;

@end
Run Code Online (Sandbox Code Playgroud)

ViewController.m:

@implementation ViewController

@dynamic view;

- (void)loadView {
  self.view = [[UIScrollView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
}

@end
Run Code Online (Sandbox Code Playgroud)

如果使用xib,而不是覆盖loadView更改视图控制器的根视图的类型并添加IBOutlet到属性.

有关更多详细信息,请参阅覆盖UIViewController的View属性,Done Right.


Nil*_*ect 18

简短的回答是你没有.原因是属性实际上只是方法,如果您尝试更改返回类型,则得到以下结果:

  • (UIView*)观点;
  • (MyView*)视图;

Objective-C中并没有允许返回类型协方差.

你可以做的是添加一个新的属性"myView",并简单地将它命名为"view"属性.这将减轻整个代码中的类型转换.只需将视图子类分配给view属性,一切都应该正常工作.