Переопределенные свойства из суперкласса - PullRequest
1 голос
/ 06 марта 2012

У меня есть суперкласс 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?

Ответы [ 2 ]

1 голос
/ 06 марта 2012

Нельзя изменить сигнатуру типа метода при переопределении метода суперкласса.

MasterViewController имеет следующие методы:

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

Но вы пытаетесь датьMasterViewController_iPad эти методы:

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

Что вы не можете сделать: вы не можете перегружать одно и то же имя метода, но иметь разные типы аргументов.

Если ItemsViewController_iPadподкласс ItemsViewController, быстрое решение - сохранить ту же подпись, что и в MasterViewController, но просто использовать ItemsViewController_iPad при установке свойства.

0 голосов
/ 27 июня 2013

Вы можете использовать категорию, если хотите переопределить свойство. Вот пример:

У меня есть PDFFileChooserViewController с PDFFileModel и PDFFilesDataSource и некоторая логика, связанная с этими свойствами.

@class PDFFileModel, PDFFilesDataSource;
@interface PDFFileChooserViewController : UIViewController

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

@end

Затем я бы хотел добавить определенный ViewController для выбора файлов из Dropbox, но в моей модели есть несколько дополнительных полей, например dropboxPath, и мой DropboxDataSource получает файлы другим способом. Поэтому я решил создать категорию и переопределить следующие свойства:

#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 только там, где я могу манипулировать этими свойствами, но другие классы видят только интерфейс суперкласса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...