0

我正在尝试制作一个具有可选顶级导航控制器的 iPhone 应用程序。

添加它很好,但是尝试设置标题不起作用,除非您尝试添加自己的导航项,此时应用程序崩溃并出现“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];

        };


    }

我该怎么做?还是有一些技术原因我不能这样做?

更新:建议在控制器的 viewDidLoad 中简单地移动控制器标题和导航项标题的分配的人对我仍然非常陌生的 Cocoa 架构的一些内部(并且对新手来说非常不直观)方面有所了解。从外观上看像 Cocoa 这样庞大而复杂且不允许您浏览源代码的框架,这是我觉得最难的那种谜。在我的其他语言和工具中,我总是可以阅读并进入代码,包括我的框架。在这里,你不能,所以你必须阅读,阅读,阅读,谢天谢地,有很多很棒的文档资源。

4

2 回答 2

1

在 UIViewController 的 init 上设置导航标题。

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";
于 2013-02-08T22:51:24.297 回答
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;
}
于 2013-02-09T00:33:45.493 回答