我有一个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_iPadItemsViewController的子类,一种快速的解决方案是保持与MasterViewController中相同的签名,但是在设置属性时只需使用ItemsViewController_iPad

09-28 01:34