Как избежать постоянного создания UINavigationControllers? - PullRequest
2 голосов
/ 01 сентября 2011

В моем приложении у меня есть много модальных представлений, которые должны быть представлены в навигационном контроллере, поэтому в итоге я делаю много таких вещей:

MyModalController *modal = [[MyModalController alloc] init];
UINavigationController *navCon = [[UINavigationController alloc] initWithRootViewController:modal];
[modal release];

[self presentModalViewController:navCon];
[navCon release];

В идеале, я быхотел бы упростить это, так что MyModalController позаботится о создании контроллера навигации.Есть ли лучшие практики для такого рода вещей?Я думаю, что я всегда мог бы просто добавить метод, подобный +navigationControllerWithModalController, но я хотел бы услышать, как другие люди делают это.

Кроме того, я хотел бы иметь возможность прикрепить делегата к MyModalControllerпоэтому я могу отправить информацию обратно в текущий контроллер представления, чтобы я знал, когда ее следует закрыть.

1 Ответ

0 голосов
/ 01 сентября 2011

Таким образом, каждый вид должен быть представлен в уникальном навигационном контроллере? Тогда вы можете немного изменить свой план и написать что-то вроде:

@interface UINavigationController (NavigationControllerWithViewController)

+ navigationControllerWithRootViewControllerOfType:(Class)type;

@end

/* ... */


@implementation UINavigationController (NavigationControllerWithViewController)

+ navigationControllerWithRootViewControllerOfType:(Class)type
{
     UIViewController *modal = [[type alloc] init];
     UINavigationController *navCon = [[UINavigationController alloc] 
                                               initWithRootViewController:modal];
     [modal release];

     return [navCon autorelease];
}

@end

Итак, вы объявили категорию на UINavigationController (то есть способ добавить новые методы в класс, не наследуя его или не имея доступа к исходному источнику), который выполняет общие функции создания экземпляра контроллера представления, создавая связанный навигационный контроллер и возвращающий его. Затем вы можете сделать:

UINavigationController *controller =
        [UINavigationController navigationControllerWithRootViewControllerOfType:
                    [MyModalController class]];

[self presentModalViewController:controller];

Или введите любой тип контроллера представления вместо MyModalController. Если вы передадите класс, который не является UIViewController, то в итоге вы передадите что-то, что не является контроллером представления, методу UINavigationController -initWithRootViewController:, поэтому будьте осторожны с этим.

Что касается делегатов, я полагаю, что вы должны сделать обычное объявление протокола и делегата, а затем добавить дополнительный параметр в метод категории вашего контроллера навигации для предоставления делегата. Вы потеряете как полезные, так и бесполезные предупреждения о времени компиляции, но вы, вероятно, захотите сделать:

[(id)modal setDelegate:delegate];

Это вызовет исключение, если вы попытаетесь создать экземпляр контроллера навигации с чем-то, что не имеет свойства делегата.

...