2012-03-05 13 views
1

私はUIViewController - MasterViewControllerのスーパークラスを持っており、itemsViewControllerというプロパティが宣言されています。これは、MasterViewControllerから呼び出されたメソッドを宣言し、IBのストーリーボードを介して配線されます。スーパークラスのオーバーライドされたプロパティ

私はこのプロパティを特定のiPadバージョンとして再宣言するMasterViewControllerのサブクラスを持っていますが、親クラスから再宣言されたプロパティにアクセスすることはできません。

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

0

プロパティを上書きする場合はカテゴリを使用できます。ここに例があります:

私は、PDFFileModelPDFFilesDataSourceとこのプロパティに関連するいくつかのロジックでPDFFileChooserViewControllerを持っています。

@class PDFFileModel, PDFFilesDataSource; 
@interface PDFFileChooserViewController : UIViewController 

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

@end 

それから私は、Dropboxのからファイルを選択するための特定のViewControllerを追加したいのですが、私のモデルは、例えば、dropboxPathのためのいくつかの追加のフィールドを持っていると私の​​は別の方法を使用してファイルを取得します。だから私は、カテゴリを作成し、このプロパティをオーバーライドすることにしました:このカテゴリには、私はその性質を操作することができる唯一のDropboxViewControllerの内側に表示されること

#import "PDFFileChooserViewController.h" 


@class DropboxFileModel,DropboxDataSource; 

@interface DropboxViewController : PDFFileChooserViewController 
@end 

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

お知らせしますが、別のクラスは唯一のスーパークラスのインタフェース

関連する問題