2012-03-05 4 views
1

나는 itemsViewController이라는 속성을 선언하는 UIViewController - MasterViewController의 수퍼 클래스를가집니다. 이 메소드는 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 

가 나는 길이 속성 상속을 오해 오전 목표 - C에서 작동?

답변

1

수퍼 클래스 메서드를 재정의 할 때 메서드의 형식 시그니처를 변경할 수 없습니다.

MasterViewController

는 이러한 방법이 있습니다

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

을하지만 당신은 MasterViewController_iPad 이러한 방법을 제공하기 위해 노력하고 : 당신이 할 수없는

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

가 : 동일한 메소드 이름을 오버로드 할 수 없습니다를 인수에는 다른 유형이 있습니다.

ItemsViewController_iPad하는 경우가 ItemsViewController의 서브 클래스, 빠른 솔루션은 MasterViewController에서와 동일한 서명을 유지하지만이 속성을 설정할 때 단순히 ItemsViewController_iPad을 사용하는 것입니다.

+0

적합하지 않음을 볼 곳이지만 그 안에 볼 수

#import "PDFFileChooserViewController.h" @class DropboxFileModel,DropboxDataSource; @interface DropboxViewController : PDFFileChooserViewController @end @interface DropboxViewController (ModelCategory) @property(nonatomic, strong) DropboxFileModel* selectedModel; @property(nonatomic, strong) DropboxDataSource* dataSource; @end 

공지 것을 : 그래서이 속성 카테고리를 생성하고 무시하기로 결정 나는 믿을만한 일을 할 것이다. – Echilon

0

속성을 재정의하려면 카테고리를 사용할 수 있습니다. 예를 들면 다음과 같습니다.

나는 PDFFileModelPDFFilesDataSource과이 논리와 관련된 일부 논리를 가지고 있습니다.

@class PDFFileModel, PDFFilesDataSource; 
@interface PDFFileChooserViewController : UIViewController 

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

@end 

은 그럼 드롭 박스에서 파일을 선택하는 특정의 ViewController를 추가하고 싶습니다하지만 내 모델은 예를 dropboxPath에 대한 몇 가지 추가 필드가 내 DropboxDataSource는 다른 방법을 사용하여 파일을 가져옵니다. 이 카테고리 DropboxViewController 단지 내가 그 속성 조작 할 수 있지만, 다른 클래스는 슈퍼 클래스 인터페이스

관련 문제