Реализация категории UIViewController - PullRequest
2 голосов
/ 25 марта 2012

Я пытаюсь реализовать категорию на моем MainContainerViewController, которая возвращает основной экземпляр:

В моем .h:

@interface UIViewController(MainViewExtension)
/** Convience method for getting access to the MainContainerViewController instance */
- (MainContainerViewController *)mainContainerExtension;
@end

В моем .m

@implementation UIViewController(MainViewExtension)
- (MainContainerViewController *)mainContainerExtension
{
    return (MainContainerViewController *)self;
}
@end

И поэтому с какого-то контроллера внешнего вида я делаю self.mainContainerExtension для доступа к экземпляру, и объявлен только один экземпляр, но он не дает мне нужный экземпляр.

NSLog(@"number of children:%i", [self.mainContainerExtension.childViewControllers count]);

Возвращает 0, хотя должно быть 3, поэтому я знаю, что это не дает мне правильных результатов.Я что-то упускаю?

Редактировать: Я знаю, что это не дает мне правильный экземпляр, потому что в viewDidLoad из MainContainerViewController у меня есть это:

- (void)viewDidLoad
{
    appDelegate.notesViewController=[[NotesViewController alloc] init];
    appDelegate.notesViewController.mainContainer=self;
    [self addChildViewController: appDelegate.notesViewController];
}

Каждый NotesViewController имеет свойство типа MainContainerViewController, поэтому у меня всегда есть способ доступа к MainContainerViewController из NotesViewControllers.Но я только что узнал о категориях и расширениях, и я подумал, что может быть проще реализовать категорию, которая дает мне доступ к представлению контейнера из любого вида, а не иметь свойство на каждом контроллере представления.Это мой первый раз, так что я уверен, что я делаю что-то не так с моей реализацией категории, просто не уверен, что это такое.

1 Ответ

0 голосов
/ 25 марта 2012

Я не думаю, что метод экземпляра, возвращающий self, может быть полезен.Какой бы объект вы ни вызывали: [someVC mainContainerExtension], у вас уже был бы ответ: это someVC.

Если у каждого NotesViewController есть свойство для содержащего VC, то не все ли вы настроены?Пока он общедоступен в заголовке NotesVC:

MainContainerViewController *mainVC = [[MainContainerViewController] alloc] init ...];

// then, after the view loads
for (UIViewController *vc in mainVC.childViewControllers) {
  NSLog(@"%@", (NotesViewController *)vc.mainContainer);
}

Также обратите внимание, что если в приложении только один NotesViewController, тот, который назначен в appDelegate, будет перезаписан.Дескриптор в appDelegate будет последним выделенным.

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