【问题标题】:UINavigationController doesn't work in a the moreNavigationController of a UITabBarControllerUINavigationController 在 UITabBarController 的 moreNavigationController 中不起作用
【发布时间】:2010-11-25 17:09:33
【问题描述】:

我在我的应用程序中处理UINavigationControllers,所有这些都由UITabBarController 处理。一切正常,直到我的控制器进入自动生成的“更多”选项卡。

我在这个简单的例子中重现了这个问题。难道我做错了什么?我想不通。

感谢您的帮助。

#import @interface testAppDelegate : NSObject { UIWindow *窗口; UITabBarController *tabBarController; } @property (nonatomic, 保留) IBOutlet UIWindow *window; @property(非原子,保留)IBOutlet UITabBarController *tabBarController; @结尾 @implementation testAppDelegate @synthesize 窗口,tabBarController; - (void)applicationDidFinishLaunching:(UIApplication *)application { tabBarController = [[UITabBarController alloc] initWithNibName:nil bundle:nil]; UINavigationController *ctrl1 = [[[UINavigationController alloc] initWithNibName:nil bundle: nil] autorelease]; ctrl1.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:1] autorelease]; UINavigationController *ctrl2 = [[[UINavigationController alloc] initWithNibName:nil bundle: nil] autorelease]; ctrl2.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:2] autorelease]; UINavigationController *ctrl3 = [[[UINavigationController alloc] initWithNibName:nil bundle: nil] autorelease]; ctrl3.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemBookmarks tag:3] autorelease]; UINavigationController *ctrl4 = [[[UINavigationController alloc] initWithNibName:nil bundle: nil] autorelease]; ctrl4.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemContacts tag:4] autorelease]; // 这个不行 UINavigationController *ctrl5 = [[[UINavigationController alloc] initWithNibName:nil bundle: nil] autorelease]; ctrl5.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemMostRecent tag:5] autorelease]; // 这个可以工作 UIViewController *ctrl6 = [[[UIViewController alloc] initWithNibName:nil bundle: nil] autorelease]; ctrl6.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemDownloads tag:6] autorelease]; tabBarController.viewControllers = [NSArray arrayWithObjects:ctrl1, ctrl2, ctrl3, ctrl4, ctrl5, ctrl6, nil]; [窗口添加子视图:tabBarController.view]; [窗口 makeKeyAndVisible]; } - (void)dealloc { [tabBarController 发布]; [窗口释放]; [超级释放]; } @结尾

【问题讨论】:

    标签: iphone uinavigationcontroller uitabbarcontroller


    【解决方案1】:

    简答:你不能嵌套导航控制器

    更长的答案:你做错了。一个更好的方法来创建你想要的东西是这样的:

    NSMutableArray *viewControllers = [NSMutableArray array];
    
    [viewControllers addObject:[[[ConverterViewController alloc] init] autorelease]];
    [viewControllers addObject:[[[UINavigationController alloc]
                                 initWithRootViewController:[[[CurrencyViewController alloc] init] autorelease]] autorelease]];
    [viewControllers addObject:[[[UINavigationController alloc]
                                 initWithRootViewController:[[[HistoryViewController alloc] init] autorelease]] autorelease]];
    [viewControllers addObject:[[[UINavigationController alloc]
                                 initWithRootViewController:[[[SetupViewController alloc] init] autorelease]] autorelease]];
    [viewControllers addObject:[[[UINavigationController alloc]
                                 initWithRootViewController:[[[HelpViewController alloc] init] autorelease]] autorelease]];
    [viewControllers addObject:[[[LinksViewController alloc] init] autorelease]];
    
    self.viewControllers = viewControllers;
    self.customizableViewControllers = [viewControllers arrayByRemovingFirstObject];
    
    
    @implementation HelpViewController
    
    #pragma mark -
    #pragma mark Initialization
    
    - (id)init
    {
        if ((self = [super initWithNibName:@"HelpView" bundle:nil]) != nil) {
            self.title = NSLocalizedString(@"Help", @"Help"); 
            self.tabBarItem.image = [UIImage imageNamed:@"question.png"];
        }
    
        return self;
    }
    

    【讨论】:

      【解决方案2】:

      我认为问题可能在于您直接使用导航控制器来推送新视图。像这样:

      [ctrl4 pushViewController:next animated:true];
      

      但是,如果您在更多选项卡中,则另一个导航控制器处于活动状态。您必须始终使用当前显示的视图控制器的 navigationController 属性获取当前导航控制器。

      通过这种方式,导航控制器可以在标签栏控制器中正常工作。

      【讨论】:

        【解决方案3】:

        当您在 UITabBarController 上设置 viewControllers 属性时,它将自动将视图控制器 5 上的导航控制器替换为 moreNavigationController。

        我在自定义标签栏上处理了类似的问题。该解决方案应该可以帮助您:

        Suppress moreNavigationController in custom UITabBarController

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-04-03
          • 1970-01-01
          • 2010-11-24
          相关资源
          最近更新 更多