Obj-C, UINavigationControllers inside a UITabbarController,简单解释一下?

Posted

技术标签:

【中文标题】Obj-C, UINavigationControllers inside a UITabbarController,简单解释一下?【英文标题】:Obj-C, UINavigationControllers within a UITabbarController, explain in simple terms? 【发布时间】:2011-12-30 17:23:59 【问题描述】:

我正在使用一些示例代码来尝试一劳永逸地弄清楚如何使导航控制器和选项卡控制器一起工作。作为奖励,没有内存泄漏。

遇到如下问题...

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
        (NSDictionary *)launchOptions

    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] 
        bounds]] autorelease];

    // Override point for customization after application launch.
    UIViewController *viewController1 = [[[FirstViewController alloc] 
            initWithNibName:@"FirstViewController" bundle:nil] autorelease];
    UIViewController *viewController2 = [[[SecondViewController alloc] 
            initWithNibName:@"SecondViewController" bundle:nil] autorelease];

    self.tabBarController = [[[UITabBarController alloc] init] autorelease];
    self.tabBarController.viewControllers = [NSArray arrayWithObjects:
         viewController1, viewController2, nil];
    self.window.rootViewController = self.tabBarController;
    self.navigationController = [[UINavigationController alloc] 
         initWithRootViewController:self.tabBarController]; <<<<

    [self.window makeKeyAndVisible];
    return YES;

在我的主要项目中,我有一个用于 4 个不同导航控制器的插座,我这样称呼每个控制器。

MyAppDelegate *delegate = (MyAppDelegate *)[[UIApplication sharedApplication] 
      delegate];
[delegate.balNavController pushViewController:nextController animated:YES];

但这会泄漏并导致问题。

如果不使用界面生成器,有人可以用简单的术语告诉我应该怎么做,也许只需要几行代码。

【问题讨论】:

您需要在 Google 或 Youtube 上搜索 UITabBarController UINavigationController tutorials 并了解所有内容然后尝试一下。这个问题的答案是一个学习的过程! 我遵循了糟糕的教程和糟糕的例子。因此,我在问一个问题,以找出我要去哪里以及正确/最佳方法是什么! 你做错了。您正在将您的 UITabBarController 实例放入 UINavigationController 的堆栈中,但根据您的问题(这也是常见的方式),您想以相反的方式进行操作。 【参考方案1】:

我强烈建议您获取Big Nerd Ranch Guide to iPhone Programming 的副本。它具有出色的说明和示例,可让您精通基础知识。现在谈谈你的问题...

一个UITabBarController 是通过给它一个NSArrayUIViewControllers 甚至UINavigationControllers 来设置的。标签栏不介意哪个。

UINavigationController 是通过将 UIViewController 作为根来设置的。

请记住,Tab Bar 不是视图控制器,因此它不能是导航控制器的根!

组合这些只是一个正确顺序的问题。这是一个通用示例,希望能说明这一点。

- (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
   
    // UIViewController with UINavigationBar
    UIViewController *firstViewController = [[UIViewController alloc] init];
    UINavigationController *firstNavController = [[UINavigationController alloc] initWithRootViewController:firstViewController];

    // Custom subclass of UIViewController with UINavigationBar
    CustomViewController *secondViewController = [[CustomViewController alloc] init];
    UINavigationController *secondNavController = [[UINavigationController alloc] initWithRootViewController:secondViewController];

    // UIViewController without UINavigationBar
    UIViewController *thirdViewController = [[UIViewController alloc] init];

    // Set the NSArray of ViewControllers
    NSArray *viewControllers = [NSArray arrayWithObjects:firstNavController, secondNavController, thirdViewController, nil];
    // This array retains the controllers, so go ahead and release them now
    [firstNavController release]; 
    [secondNavController release]; 
    [thirdViewController release]; 

    // Set up the UITabBarController -  It now holds everything
    tabBarController = [[UITabBarController alloc] init];
    [tabBarController setViewControllers:viewControllers];

    // Add the Tab Bar Controller to the window.
    [window addSubview:[tabBarController view]];
    [window makeKeyAndVisible];

    return YES;

【讨论】:

感谢您的回答。所以我认为 firstNavController、secondNavController 等将被选为 tab1、tab2 等?而且我可以在我的应用程序中使用 self.navigationController 来推送和弹出视图控制器/第一和第二视图控制器的子节点,它们将在每个选项卡中维护? @Jules 没错。每个选项卡都有一个单独的导航控制器(或根本没有)。

以上是关于Obj-C, UINavigationControllers inside a UITabbarController,简单解释一下?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中使用 Obj-C 类扩展?

在 Swift 中使用 Obj-C 类扩展?

OBJ-C:核心绘图 XY 轴固定

使用 iOS/Obj-c 按类型搜索 Apple App Store

javascript中具有多个参数的obj-c方法

成员引用基类型“void”不是结构或联合 (OBJ-C)