UINavigationController не работает в moreNavigationController UITabBarController
Я имею дело с UINavigationControllers
в моем приложении все обрабатывается UITabBarController
, Все работает нормально, пока мои контроллеры не попадают в автоматически сгенерированную вкладку "Дополнительно".
Я воспроизвел проблему в упрощенном примере. Я делаю что-то неправильно? Я не могу понять.
Спасибо за вашу помощь.
#import@interface testAppDelegate: NSObject { UIWindow * window; UITabBarController * tabBarController; } @property (nonatomic, retain) IBOutlet UIWindow * window; @property (nonatomic, retain) IBOutlet UITabBarController * tabBarController; @конец @implementation testAppDelegate окно @synthesize, tabBarController; - (void) applicationDidFinishLaunching: (UIApplication *) приложение { 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: UITabBarSystemItemFabilities 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]; [окно addSubview: tabBarController.view]; [window makeKeyAndVisible]; } - (недействительно)dealloc { [tabBarController release]; [окно выпуска]; [супер сделка]; } @конец
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;
}
Когда вы устанавливаете свойство viewControllers на UITabBarController, оно автоматически заменяет контроллеры навигации на контроллерах представления 5 и далее на moreNavigationController.
Я имел дело с подобной проблемой на моей панели вкладок. Это решение должно помочь вам:
Подавить moreNavigationController в пользовательском UITabBarController
Я думаю, что проблема может быть в том, что вы используете навигационные контроллеры напрямую, чтобы выдвигать новые представления. Как это:
[ctrl4 pushViewController:next animated:true];
Но если вы находитесь в дополнительной вкладке, другой контроллер навигации активен. Вы всегда должны получить текущий контроллер навигации, используя свойство navigationController текущего отображаемого контроллера представления.
Делая это таким образом, навигационные контроллеры прекрасно работают внутри контроллера панели вкладок.