我有一个UIViewController-MasterViewController
的超类,它声明了一个名为itemsViewController
的属性。这声明了一个从MasterViewController调用的方法,并通过IB中的情节提要进行了连接。
我有一个MasterViewController的子类,该子类将该属性重新声明为特定的iPad版本,但是无法从父类访问该redeclared属性。
MasterViewController
@interface MasterViewController : UIViewController {
}
@property (nonatomic, strong) IBOutlet ItemsViewController *itemsViewController;
@end
@implementation MasterViewController
@synthesize itemsViewController;
-(void)viewDidLoad {
// I can access itemsViewController in viewDidLoad.
}
@end
MasterViewController_iPad
@interface MasterViewController_iPad : MasterViewController {
IBOutlet ItemsViewController_iPad *_itemsViewController;
}
@property (nonatomic, strong) IBOutlet ItemsViewController_iPad *itemsViewController;
@end
@implementation MasterViewController_iPad
@synthesize itemsViewController = _itemsViewController;
-(void)viewDidLoad {
[super viewDidLoad];
// when I call super viewDidLoad, itemsViewController is nil, as though the property hasn't been overriden
// _itemsViewController is not nil in viewDidLoad.
}
@end
我是否误解了Objective-C中属性继承的工作方式?
最佳答案
覆盖超类方法时,不能更改方法的类型签名。MasterViewController
具有以下方法:
(void)setItemsViewController:(ItemsViewController *)foo
(ItemsViewController *)itemsViewController
但是,您尝试提供
MasterViewController_iPad
这些方法:(void)setItemsViewController:(ItemsViewController_iPad *)foo
(ItemsViewController_iPad *)itemsViewController
您不能执行的操作:您不能重载相同的方法名称,但要为参数使用不同的类型。
如果
ItemsViewController_iPad
是ItemsViewController
的子类,一种快速的解决方案是保持与MasterViewController
中相同的签名,但是在设置属性时只需使用ItemsViewController_iPad
。