ios从appdelegate启动登录并从登录推送uitabbarcontroller

ios从appdelegate启动登录并从登录推送uitabbarcontroller,ios,iphone,objective-c,xcode,Ios,Iphone,Objective C,Xcode,我已将AppDelegate中的第一个视图设置为根控制器…这是一个登录屏幕。当按下登录按钮时,我正在按一个包含所有视图的UITabBarController。我遇到的问题是1)我似乎无法摆脱后退按钮,2)我无法在按下视图后在视图上添加任何导航栏按钮,但视图上的虚拟文本显示出来,3)无法设置视图的标题。基本上,现在我不能修改导航栏。以下是我所拥有的: AppDelegate.m #import "AppDelegate.h" #import "LoginViewController.h" - (

我已将AppDelegate中的第一个视图设置为根控制器…这是一个登录屏幕。当按下登录按钮时,我正在按一个包含所有视图的UITabBarController。我遇到的问题是1)我似乎无法摆脱后退按钮,2)我无法在按下视图后在视图上添加任何导航栏按钮,但视图上的虚拟文本显示出来,3)无法设置视图的标题。基本上,现在我不能修改导航栏。以下是我所拥有的:

AppDelegate.m

#import "AppDelegate.h"
#import "LoginViewController.h"

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
LogInViewController *login = [[LogInViewController alloc]init];
UINavigationController *loginNav = [[UINavigationController alloc]initWithRootViewController:login];
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.window.rootViewController = loginNav;
[self.window addSubview:loginNav.view];
[self.window makeKeyAndVisible];
return YES;
}
那部分很好用。现在登录ViewController.m:

//button from nav bar is pressed and I create the tabbar
- (void)push:(id)sender{
UITabBarController *tabBarController = [[UITabBarController alloc] init];

NSMutableArray *tabItems = [[NSMutableArray alloc]initWithCapacity:4];

View1 *view1 = [[View1 alloc]init];
UINavigationController *view1Nav = [[UINavigationController alloc]initWithRootViewController:view1];
view1Nav.tabBarItem.title = @"View1";
view1Nav.navigationController.navigationBarHidden = YES; //<--doesn't get set from here either
[tabItems addObject:view1Nav];

View2 *view2 = [[View2 alloc]init];
UINavigationController *view2Nav = [[UINavigationController alloc]initWithRootViewController:view2];
[tabItems addObject:view2Nav];

View3 *view3 = [[View3 alloc]init];
UINavigationController *view3Nav = [[UINavigationController alloc]initWithRootViewController:view3];
[tabItems addObject:view3Nav];

View4 *view4 = [[View4 alloc]init];
UINavigationController *view4Nav = [[UINavigationController alloc]initWithRootViewController:view4];
[tabItems addObject:view4Nav];

tabBarController.viewControllers = tabItems;
tabBarController.navigationItem.leftBarButtonItem = nil;//doesn't work either...
[self.navigationController pushViewController:tabBarController animated:YES];
}

我做错了什么?有没有可能像我试图做的那样以编程方式做每件事?

以编程方式做每件事没有错。但我认为这会导致更多的人为错误。不管怎样,让我们开始解决这个问题

您应该从代码中删除下面的行。这是完全错误的。您正在向窗口添加另一个冗余视图

[self.window addSubview:loginNav.view];
最好替换以下行:

[self.navigationController pushViewController:tabBarController animated:YES];
这样做(通过这样做,您将从导航堆栈中删除登录页面,后退按钮将不再是问题):

一旦你完成了以上工作,你应该给出你的结果。我想那就足够了。代码的其余部分似乎还可以

编辑:您可以尝试下面的代码(我能够在项目中使用它)


如果要隐藏“后退”按钮,应使用
backBarButtonItem
而不是
leftBarButtonItem
,或者在选项卡控制器的导航项上调用
hidesBackButton
,而不是在自定义视图中,因为选项卡控制器是导航控制器的直接后代


就标题而言,我认为iOS不支持嵌套导航控制器,也就是说,一次只能有一个导航栏,在您提出的方案中,这将是最高级别导航控制器的导航栏。您真的需要嵌套的导航控制器吗?也许有更好的方法来完成你想做的事情。

所以你在导航控制器中有一个选项卡栏控制器,有4个选项卡也是导航控制器,对吗?@michaels是的,没错。LoginViewController是一个导航控制器,我正在从中按下带有4个选项卡的选项卡栏控制器,这些选项卡也是导航控制器谢谢回答。我得到的警告是SetViewController需要一个数组,而tabBarController是一个UITabBarController。我尝试使用视图控制器数组,但它崩溃了,并给出了“由于未捕获的异常'nsInternalInconsistencException'而终止应用程序,原因是:'导航控制器中不允许使用UINavigationController!'”这样的答案!没有后退按钮。现在可以设置标题和导航栏按钮了吗?或者我应该去掉选项卡栏中的导航控制器并添加自定义选项卡栏吗?因为它仍然不允许我添加标题或导航栏按钮…我更新了我的答案。请将结果告知我们。因为我们将
view1.navigationBarHidden
设置为
YES
,所以您看到的导航栏是外部导航控制器的导航栏(即
loginNav
)。您应该隐藏它,并在每个内部导航控制器上显示四个导航栏。我想您看到的是
loginNav
s导航栏。无论我在哪里设置BackBarButtonim,它仍然不起作用。如果我做不到,我会重新考虑我的结构。伊斯梅尔古莱克在没有导航栏的情况下用他的编辑使它工作。现在我需要弄清楚如何设置选项卡视图上的标题和按钮
[self.navigationController pushViewController:tabBarController animated:YES];
[self.navigationController setViewControllers:@[tabBarController] animated:YES];
View1 *view1 = [[View1 alloc]init];
UINavigationController *view1Nav = [[UINavigationController alloc]initWithRootViewController:view1];
view1.tabBarItem.title = @"View1";
view1Nav.navigationBarHidden = YES;
[view1.view addSubview:view1Nav.view];
[tabItems addObject:view1];