4

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

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

谢谢你的帮助。

#import <UIKit/UIKit.h>

@interface testAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{
    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 发布];
    [窗口释放];
    [超级释放];
}

@结尾
4

3 回答 3

2

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

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

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;
}
于 2009-09-07T15:23:31.200 回答
0

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

[ctrl4 pushViewController:next animated:true];

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

通过这样做,导航控制器在标签栏控制器中工作得很好。

于 2009-09-14T14:36:52.203 回答
0

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

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

抑制自定义UITabBarController中的moreNavigationController

于 2012-05-02T16:05:53.850 回答