我有一个 UIViewController 的父类(super class) - MasterViewController
,它声明了一个名为 itemsViewController
的属性。这声明了一个从 MasterViewController 调用的方法,并通过 IB 中的 Storyboard进行连接。
我有一个 MasterViewController 的子类,它将此属性重新声明为特定的 iPad 版本,但我无法从父类访问重新声明的属性。
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 中属性继承的工作方式?
最佳答案
重写父类(super class)方法时不能更改方法的类型签名。
MasterViewController
有这些方法:
(void)setItemsViewController:(ItemsViewController *)foo
(ItemsViewController *)itemsViewController
但是您正试图为 MasterViewController_iPad
提供这些方法:
(void)setItemsViewController:(ItemsViewController_iPad *)foo
(ItemsViewController_iPad *)itemsViewController
你不能这样做:你不能重载相同的方法名称但参数类型不同。
如果 ItemsViewController_iPad
是 ItemsViewController
的子类,一个快速的解决方案是保持与 MasterViewController
相同的签名,但只需使用 code>ItemsViewController_iPad
当你设置属性时。
关于iphone - 来自父类(super class)的重写属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573197/