当应用程序rootViewController是tabBarController时,UINavigationController的奇怪行为

时间:2014-07-03 08:07:52

标签: ios objective-c

我尝试将UIViewController推送到UINavigationController上。 NavigationBar更改(即出现后退按钮),但未按下视图(*)。

我有一个UITabBarController作为我的应用程序RootViewController。

当我切换到另一个选项卡然后切换回来时,视图(*)被推送。

我以前从未见过这种行为。我的问题与this完全相同,但是解决这个问题的方法并没有解决我的问题。

首先

enter image description here

按下行

enter image description here

我知道这个问题可能与AppDelegate中的问题有关,因此我发布了我使用的代码。

代码:

AppDelegate中的

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:     (NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.window.backgroundColor = [UIColor whiteColor];
[MagicalRecord setupCoreDataStackWithStoreNamed:@"DBModel"];

/* CONTACTS LIST CONTROLLER */
BoonContactListViewController *contactListViewController = [[BoonContactListViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *contactListNavigationController = [[UINavigationController alloc] initWithRootViewController:contactListViewController];
[contactListNavigationController setValue:[[BoonNavigationBar alloc]init] forKeyPath:@"navigationBar"];
contactListNavigationController.tabBarItem.title = [NSLocalizedString(@"CONTACTS", nil) capitalizedString];
contactListNavigationController.tabBarItem.image = [UIImage imageNamed:@"menu_contacts.png"];


/* INVITATIONS */

BoonInvitationListViewController *invitationListController = [[BoonInvitationListViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *invitationNavigationController = [[UINavigationController alloc] initWithRootViewController:invitationListController];
[invitationNavigationController setValue:[[BoonNavigationBar alloc]init] forKeyPath:@"navigationBar"];
invitationNavigationController.tabBarItem.title = [NSLocalizedString(@"SETTINGS", nil) capitalizedString];
invitationNavigationController.tabBarItem.image = [UIImage imageNamed:@"menu_invitations.png"];

/* SETTINGS */
BoonSettingsViewController *settingsViewController = [[BoonSettingsViewController alloc] initWithNibName:nil bundle:nil];
UINavigationController *settingsNavigationController = [[UINavigationController alloc] initWithRootViewController:settingsViewController];
[settingsNavigationController setValue:[[BoonNavigationBar alloc]init] forKeyPath:@"navigationBar"];
settingsNavigationController.tabBarItem.title = [NSLocalizedString(@"SETTINGS", nil) capitalizedString];
settingsNavigationController.tabBarItem.image = [UIImage imageNamed:@"menu_settings.png"];



/* TAB BAR */
BoonTabBarViewController *tabBarController = [[BoonTabBarViewController alloc] init];
tabBarController.viewControllers = @[contactListNavigationController, invitationNavigationController, settingsNavigationController];

[self.window setRootViewController:tabBarController];

[self.window makeKeyAndVisible];

[tabBarController showLogin];
return YES;
}

修改

在我试图推送的viewController中,viewWillAppearviewDidLoadviewDidAppear都没有被调用。

如果我使用presentViewController: animated: completion:,我会得到首选行为,而不是

编辑2

我如何推送新的VC

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

BoonContactInfoViewController *contactInfoViewController = [[BoonContactInfoViewController alloc] initWithNibName:nil bundle:nil];
NSLog(@"NAV %@", self.navigationController);
[self.navigationController pushViewController:contactInfoViewController animated:YES];
}

编辑3 它只是初始选项卡无法推送...如果我交换第一个和第二个选项卡的位置,我可以按照我上面的方式使用视图控制器。

编辑4 如果我(在我的tabBarController中)调用

,它可以工作
self.selectedIndex = 1;
self.selectedIndex = 0;

编辑5

- (void)showLogin
{

if([BoonUserHandler getLogin].length > 0 && [BoonUserHandler getPassword].length > 0){
    return;
}
BoonWelcomeViewController *welcomeWC = [[BoonWelcomeViewController alloc] initWithNibName:nil bundle:nil];

UINavigationController *welcomeNavigationController = [[UINavigationController alloc] initWithRootViewController:welcomeWC];
[welcomeNavigationController setNavigationBarHidden:YES];


[self presentViewController:welcomeNavigationController animated:NO completion:nil];
}

2 个答案:

答案 0 :(得分:1)

您正在为什么版本的iOS开发?

我首先要问你为什么要在导航栏中黑客攻击:

[settingsNavigationController setValue:[[BoonNavigationBar alloc]init] forKeyPath:@"navigationBar"];

而不是iOS5 + UINavigationController方法:

- (instancetype)initWithNavigationBarClass:(Class)navigationBarClass toolbarClass:(Class)toolbarClass

但我的总体建议是删除所有这些代码并使用故事板。这看起来是一个绝佳的机会。

答案 1 :(得分:0)

我认为你的导航控制器出错了,这就是为什么它会出现这个问题..

  

您必须从标签控制器

获取正确的导航控制器
  self.tabBarController.selectedIndex = 0;

只需更改标签控制器选择的索引