Таким образом, каждый вид должен быть представлен в уникальном навигационном контроллере? Тогда вы можете немного изменить свой план и написать что-то вроде:
@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];
Это вызовет исключение, если вы попытаетесь создать экземпляр контроллера навигации с чем-то, что не имеет свойства делегата.