2013-02-08 2 views
0

Я пытаюсь сделать приложение iPhone с дополнительным навигационным контроллером верхнего уровня.Могу ли я вставить UINavigationController и установить заголовок выше моего экземпляра UITabBarController, установленного в моем приложении appdelegateDidFinishLaunching?

Добавить это нормально, но попытка установить заголовок не работает, если вы не попытаетесь добавить свой собственный элемент навигации, после чего приложение вылетает с «NSInternalInconsistencyException» по причине: «Невозможно вызвать pushNavigationItem: анимированный : непосредственно на UINavigationBar, управляемом контроллером ».

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    rootHasNavBar = NO; 

    if (window && viewController) 
    { 

     // Tab Controller is root: 
     if (!rootHasNavBar) 
     { 
      window.rootViewController = viewController; // viewController:UITabBarController 
      [window makeKeyAndVisible]; 
     } 
     else 
     { 
      // Navigation controller above UITabBarController 
      UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
      window.rootViewController = navigationController; 
     //Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Cannot call pushNavigationItem:animated: directly on a UINavigationBar managed by a controller.' 

      UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:NSLocalizedString(@"RentalPoint",nil)]; 
      [ navigationController.navigationBar pushNavigationItem:item animated:YES]; 

      navigationController.toolbarHidden = YES; 
      [window makeKeyAndVisible]; 

     }; 


    } 

Как это сделать? Или есть какая-то техническая причина, почему я не могу этого сделать?

Обновление: люди, которые предложили просто переместить назначение заголовка контроллера и заголовка элемента навигации в представлении контроллераDidLoad, были включены в некоторые внутренние (и крайне неинтуитивные для нового человека) аспекты архитектуры Cocoa, которые все еще были мне незнакомы , С внешней стороны, глядя на структуру, такую ​​как Cocoa, которая огромна и сложна, и которая не позволяет вам просматривать исходный код, это та тайна, которую я считаю наиболее сложной. На других языках и инструментах я всегда могу читать и входить в код, включая мои фреймворки. здесь вы не можете, и поэтому вы должны читать, читать, читать и, к счастью, есть много отличных источников документации.

+0

Не могли бы вы объяснить, как вы заявляете и инициализации rootHasNavBar? Как насчет viewController, это в nib/раскадровке? Странно, что viewController может быть корневым vc окна, тогда он также может быть назначен в качестве корня vc нового контроллера навигации. – danh

+0

ViewController - это созданный экземпляр UITabBarController, и является корневым контроллером, если мне не нужен над ним UINavigationController. BOOL считывается из prefs. –

ответ

1

Укажите название навигации в начале вашего UIViewController.

self.title = @"My Title"; 
self.navigationItem.title = @"Nav Title"; //note: this will show-up in the back button when you push a subsequent view 

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

viewController.title = @"My Title"; 
+0

Если мой UIViewController настроен на nib-instatiated, я мог бы установить их в Interface Builder без какого-либо кода? –

+0

http: // stackoverflow.com/questions/7418511/is-it-possible-to-set-navigationitem-title-from-a-views-nib – Joel

+0

Принимая этот ответ, потому что это то, что мне было легче всего сделать. Другой ответ также работает. –

1

Я полагаю, что контроллер панели вкладок в качестве корня навигационного контроллера является более сложный случай, поэтому я сделал это в IB, сохранив более простой случай для кода. Во-первых, я сделал следующее (все в IB):

  1. создал новый единый вид проекта
  2. удален VC по умолчанию и добавил навигации VC
  3. удален дефолте корень навигационной Vc в (таблица Vc)
  4. окрашен контроллер панели вкладок и сделал, что корень
  5. осмотрен пункт навигации в барном контроллере вкладки и установите его название на «пункт проката»

Я думаю, что это приложение предоставляет «дополнительный случай», на который вы ссылаетесь на контроллер панели вкладок, окруженный навигационным контроллером (вы сказали «над ним», но ваш код говорит «вокруг него, с ним как с корнем»).

Теперь проще случае легче достичь в appDidFinishLaunching, как следует ...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // if I don't want the optional case, if I just want a tab bar controller as 
    // my window's root, grab it from the navigation controller, and make it the window's 
    // root (thereby abandoning the navigation controller) 

    if (YES) { 
     UINavigationController *navVC = (UINavigationController *)self.window.rootViewController; 
     self.window.rootViewController = [navVC.viewControllers objectAtIndex:0]; 
    } 

    return YES; 
} 
+0

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

+0

Вы определенно строите этот контроллер навигации с контроллером панели вкладок в качестве корня, что немного необычно. В том случае, если вы хотите, чтобы контроллер навигации «выше» был установлен по умолчанию, что вы хотите использовать в качестве корня навигационного контроллера? – danh

+0

Я знаю, что хочу визуально и логически (чтобы иметь возможность использовать контроллер навигации, чтобы вернуться на этот главный экран с помощью кнопки «Назад»), но не уверен, что я должен иметь в качестве корневого контроллера приложения. –

Смежные вопросы