Несколько корневых контроллеров представления для UINavigationController? - PullRequest
0 голосов
/ 20 сентября 2011

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

Я думал установить класс менеджера представления (UIViewController) в качествекорневой вид контроллера контроллера навигации.В диспетчере представлений мы проверяем настройки, чтобы увидеть, какое представление мы хотим загрузить:

if([application_mode intValue]==APPLICATION_MODE_A){
    AViewController *aView = [[DeviceTableViewController alloc] init];
    [self.view insertSubview:aView.view atIndex:0];
}
else if([application_mode intValue]==APPLICATION_B){
    BViewController *bView = [[BViewController alloc] init];
    [self.view insertSubview.bView.view atIndex:0];
}

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

Как правильно это сделать?Я бы предпочел, чтобы у меня не было одного огромного стола!

Ответы [ 2 ]

3 голосов
/ 20 сентября 2011

Где вы установите навигационный контроллер rootViewController?Разве вы не можете просто установить его для объекта AviewController или BViewController в это время?Возможно, вам не понадобится промежуточный UIViewController

Я бы сделал в начале:

//navigationController comes from a Xib or previous code
if([application_mode intValue]==APPLICATION_MODE_A){
    AViewController *aView = [[DeviceTableViewController alloc] init];
    navigationController.rootViewController = aView;
    [aView release];
}
else if([application_mode intValue]==APPLICATION_B){
    BViewController *bView = [[BViewController alloc] init];
    navigationController.rootViewController = bView;
    [bView release];
}
1 голос
/ 20 сентября 2011

Поскольку в контроллере представления нет содержимого, мне нравится подход, изложенный в блоге Джоны Уильяма:

http://blog.carbonfive.com/2011/03/09/abusing-uiviewcontrollers/

Вы не можете эффективно разместить контроллер представления внутри другого; вместо этого мы создаем что-то с похожими методами жизненного цикла (viewDidLoad, viewDidAppear и т. д.) и перенаправляем эти методы от родителя к потомку. Этот psudo-viewcontroller имеет свойство view, которое мы добавляем в качестве подпредставления для родительского представления, используя UIView addSubView

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/instm/UIView/addSubview:

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

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