2012-03-05 126 views
1

我有一個UIViewController的超類 - MasterViewController,它聲明瞭一個名爲itemsViewController的屬性。這聲明瞭從MasterViewController調用的方法,並通過IB中的故事板進行了佈線。超類的重寫屬性

我有一個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的作品?

回答

1

當您重寫超類方法時,不能更改方法的類型簽名。

MasterViewController有以下方法:

(void)setItemsViewController:(ItemsViewController *)foo 
(ItemsViewController *)itemsViewController 

但你想給MasterViewController_iPad這些方法:

(void)setItemsViewController:(ItemsViewController_iPad *)foo 
(ItemsViewController_iPad *)itemsViewController 

,你不能做的:你不能超載同樣的方法名稱但對於論據有不同的類型。

如果ItemsViewController_iPadItemsViewController一個子類,一個快速的解決辦法是保持相同的簽名在MasterViewController而僅僅使用ItemsViewController_iPad當您設置屬性。

+0

不理想,但它我會相信的。 – Echilon 2012-03-07 14:28:33

0

如果您想覆蓋屬性,則可以使用類別。這裏是例子:

我有PDFFileChooserViewControllerPDFFileModelPDFFilesDataSource和一些與此屬性相關的邏輯。

@class PDFFileModel, PDFFilesDataSource; 
@interface PDFFileChooserViewController : UIViewController 

@property (nonatomic, strong) PDFFileModel* selectedModel; 
@property (nonatomic, strong) PDFFilesDataSource*dataSource; 

@end 

然後我想補充特定的ViewController從Dropbox的選擇文件,但我的模型有一些附加字段,例如dropboxPath和我​​使用其他方式獲取文件。所以我決定創建類別,並覆蓋該屬性:

#import "PDFFileChooserViewController.h" 


@class DropboxFileModel,DropboxDataSource; 

@interface DropboxViewController : PDFFileChooserViewController 
@end 

@interface DropboxViewController (ModelCategory) 
@property(nonatomic, strong) DropboxFileModel* selectedModel; 
@property(nonatomic, strong) DropboxDataSource* dataSource; 
@end 

注意,此類別將是可見的內部DropboxViewController只有在那裏我可以與該屬性可以操作,但另一個班只看到超類接口