我可以在我的 appdelegate applicationDidFinishLaunching 中插入 UINavigationController 并在我的笔尖实例化的 UITabBarContr

Posted

技术标签:

【中文标题】我可以在我的 appdelegate applicationDidFinishLaunching 中插入 UINavigationController 并在我的笔尖实例化的 UITabBarController 上方设置标题吗?【英文标题】:Can I insert a UINavigationController and set the title above my nib instantiated UITabBarController in my appdelegate applicationDidFinishLaunching? 【发布时间】:2013-02-08 22:44:30 【问题描述】:

我正在尝试制作一个具有可选***导航控制器的 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 这样庞大而复杂且不允许您浏览源代码的框架,这是我觉得最难的那种谜。在我的其他语言和工具中,我总是可以阅读并进入代码,包括我的框架。在这里,你不能,所以你必须阅读、阅读、阅读,谢天谢地,这里有很多很棒的文档资源。

【问题讨论】:

你能解释一下你是如何声明和初始化rootHasNavBar的吗? viewController 怎么样,在 nib/storyboard 中吗?对我来说很奇怪 viewController 可能是窗口的根 vc,然后它也可能被分配为新导航控制器的根 vc。 viewController 是 nib 实例化的 UITabBarController,并且是根控制器,除非我需要它上面的 UINavigationController。 BOOL 是从首选项中读取的。 【参考方案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";

【讨论】:

如果我的 UIViewController 是 nib-instatiated 我可以在 Interface Builder 中设置这些而不需要任何代码吗? ***.com/questions/7418511/… 接受这个答案,因为这是我发现最容易做的事情。其他答案也有效。【参考方案2】:

我认为标签栏控制器作为导航控制器的根是更复杂的情况,所以我在 IB 中这样做,为代码节省了更简单的情况。首先,我做了以下事情(全部在 IB 中):

    创建了一个新的单视图项目 删除默认vc并添加导航vc 删除了导航 vc 的默认根目录(一个表 vc) 绘制了一个标签栏控制器并将其作为根 检查标签栏控制器的导航项并将其标题设置为“租赁点”

我认为这为我的应用提供了您所指的“可选情况”,标签栏控制器被导航控制器包围(您说“在它之上”,但您的代码说“围绕它,以它为根”) .

现在更简单的情况在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;

【讨论】:

我认为这是我的代码的问题?我希望它在视觉上高于它,不一定与它里面的其他视图。 您肯定是在构建以标签栏控制器为根的导航控制器,这有点不寻常。如果您希望导航控制器“高于”默认 UI,您希望拥有什么作为导航控制器的根? 我知道我在视觉上和逻辑上想要什么(能够使用导航控制器使用后退按钮返回此主屏幕)但不确定我应该拥有什么作为应用程序根控制器. 所以我们是否可以将您的应用程序视为基本上是一个选项卡式应用程序,除非在某些情况下您想要呈现一个导航控制器(在顶部,没有可见的主应用程序选项卡)。该导航控制器应该进行正常的向下钻取,但在根级别有一个“后退”按钮,并且该后退按钮应该关闭导航控制器并再次显示标签栏控制器??? (这是一口。如果这是你想要的,我想我知道如何做到这一点)。

以上是关于我可以在我的 appdelegate applicationDidFinishLaunching 中插入 UINavigationController 并在我的笔尖实例化的 UITabBarContr的主要内容,如果未能解决你的问题,请参考以下文章

我可以在我的 appdelegate applicationDidFinishLaunching 中插入 UINavigationController 并在我的笔尖实例化的 UITabBarContr

静态成员“负载”不能用于“AppDelegate”类型的实例

subscribeNext 没有在 AppDelegate 中获取值

NSTimer 选择器不重复

如何在我的 AppDelegate 上设置多个本地通知?

AppDelegate 方法仅在应用程序已打开时从通知中调用