UINavigationController не работает в moreNavigationController UITabBarController

Я имею дело с UINavigationControllers в своем приложении, и все это обрабатывается UITabBarController. Все работает нормально, пока мои контроллеры не попадут на автоматически сгенерированную вкладку «Еще».

Я воспроизвел проблему на упрощенном примере. Я делаю что-то неправильно? Я не могу понять.

Спасибо за вашу помощь.

#import <UIKit/UIKit.h>

@interface testAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate>
{
    UIWindow *window;
    UITabBarController *tabBarController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@end

@implementation testAppDelegate
@synthesize window, 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];

    // This one won't work
    UINavigationController *ctrl5 = [[[UINavigationController alloc] initWithNibName:nil bundle: nil] autorelease];
    ctrl5.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemMostRecent tag:5] autorelease];

    // This one will work
    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];

    [window addSubview:tabBarController.view];
    [window makeKeyAndVisible];
}

- (void)dealloc
{
    [tabBarController release];
    [window release];
    [super dealloc];
}

@end

person Community    schedule 04.09.2009    source источник


Ответы (3)


Краткий ответ: вы не можете вкладывать контроллеры навигации

Более длинный ответ: вы делаете это неправильно. Лучший способ создать то, что вы хотите, выглядит так:

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;
}
person Pierre Bernard    schedule 07.09.2009

Я думаю, проблема может заключаться в том, что вы используете контроллеры навигации напрямую для отправки новых представлений. Нравится:

[ctrl4 pushViewController:next animated:true];

Но если вы находитесь на вкладке «Дополнительно», активен другой контроллер навигации. Вы всегда должны получать текущий контроллер навигации, используя свойство navigationController текущего отображаемого контроллера представления.

Таким образом, контроллеры навигации отлично работают внутри контроллера панели вкладок.

person Jacob Wallström    schedule 14.09.2009

Когда вы устанавливаете свойство viewControllers в UITabBarController, он автоматически заменяет контроллеры навигации на контроллерах представления 5 и далее на moreNavigationController.

Я столкнулся с аналогичной проблемой на своей настраиваемой панели вкладок. Это решение должно помочь вам:

Подавить moreNavigationController в настраиваемом UITabBarController

person Ben M    schedule 02.05.2012