iphone - 来自父类(super class)的重写属性

标签 iphone objective-c ios inheritance properties

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

关于iphone - 来自父类(super class)的重写属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573197/

相关文章:

ios - iOS 8中的UITextView文本选择和高亮跳转

ios - 启动图像未在 iPhone 应用程序中加载

objective-c - UIScrollView 不在 xcode 4 中滚动?

objective-c - 从 NSWorkspace 获取 NSWindow 对象?

objective-c - 返回 null 的按钮数组

ios - 在 Interface Builder 中更改导航栏标题字体

iOS - TestFlight 是否具有与应用程序实时发布到 App Store 相同的严格标准?

ios - 由于位置管理器的原因,展开转场后发生崩溃

ios - 我如何在 Swift 2.0 中使用 Rect 获取 subView

ios - 如何成功深层链接到目标 View 需要时间加载的已关闭应用程序