以编程方式将选项卡栏控制器添加到当前 App Flow
Posted
技术标签:
【中文标题】以编程方式将选项卡栏控制器添加到当前 App Flow【英文标题】:Add a Tab Bar Controller Programmatically to current App Flow 【发布时间】:2013-05-06 10:06:55 【问题描述】:我想在我当前的 App Flow 中添加一个标签栏控制器。目前我有一个带有按钮的页面,单击该按钮会打开一个新的视图控制器,其中包含用户登录的 Web 视图,登录后我想带他到他的主页,其中导航栏有他的名字和右侧的注销按钮.主页还应该有一个带有 3 个不同选项卡的选项卡栏。 我能够从 webview 加载主页视图并获取导航栏。但我无法添加 tabBar 并让它工作。我对在哪里添加用于添加 TabBar 的代码感到困惑。我正在使用下面的代码添加标签栏 -
UITabBarController *tabBar = [[UITabBarController alloc] init];
HomeViewController *home = [[PPHomeViewController alloc] initWithUserName:[self.userInfo objectForKey:@"name"] Email:[self.userInfo objectForKey:@"email"] Phone:[self.userInfo objectForKey:@"phone_number"]];
home.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:1];
UINavigationController *homeNavController = [[UINavigationController alloc]initWithRootViewController:home];
RequestViewController *req = [[RequestMoneyViewController alloc]init];
req.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:2];
UINavigationController *reqNavController = [[UINavigationController alloc]initWithRootViewController:req];
UIViewController *thirdViewController = [[UIViewController alloc]init];
thirdViewController.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:3];
UINavigationController *thirdNavController = [[UINavigationController alloc]initWithRootViewController:thirdViewController];
UIViewController *fourthViewController = [[UIViewController alloc]init];
thirdViewController.tabBarItem = [[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFavorites tag:3];
UINavigationController *fourthNavController = [[UINavigationController alloc]initWithRootViewController:fourthViewController];
tabBar.viewControllers = [[NSArray alloc] initWithObjects:homeNavController, reqNavController, thirdNavController, fourthNavController, nil];
tabBar.delegate=self;
tabBar.selectedIndex=0;
UIImageView *homeImg=[[UIImageView alloc]initWithFrame:CGRectMake(0, 432, 80, 49)];
homeImg.tag=11;
homeImg.image=[UIImage imageNamed:@"footer"];
UIImageView *reqImg=[[UIImageView alloc]initWithFrame:CGRectMake(81, 432,80, 49)];
reqImg.tag=12;
reqImg.image=[UIImage imageNamed:@"footer"];
UIImageView *sendImg=[[UIImageView alloc]initWithFrame:CGRectMake(162, 432,80, 49)];
sendImg.tag=13;
sendImg.image=[UIImage imageNamed:@"footer"];
UIImageView *localImg=[[UIImageView alloc]initWithFrame:CGRectMake(243, 432, 80, 49)];
localImg.tag=14;
localImg.image=[UIImage imageNamed:@"footer"];
[tabBar.view addSubview:homeImg];
[tabBar.view addSubview:reqImg];
[tabBar.view addSubview:sendImg];
[tabBar.view addSubview:localImg];
[[[UIApplication sharedApplication]keyWindow]addSubview:tabBar.view];
目前,我已将上述代码放在扩展 UITabBarController 的 ViewController TabViewController 的 viewDidLoad 中。在我的 webView 控制器中,我输入了以下代码 -
TabViewController *tab=[[TabViewController alloc] init];
tab.userInfo=userInfo;
[self presentViewController:tab animated:YES completion:nil];
但是,当我单击已打开的选项卡以外的任何选项卡时,应用程序就会崩溃。 请帮忙。
【问题讨论】:
你必须检查你的视图树...在哪个视图中添加标签栏.. 我想在登录后出现的视图中添加tabBar - 即视图树中webview之后的视图。 您是否尝试创建一个UINavigationController
作为根视图控制器并在登录时推送您的 TabViewController ?
【参考方案1】:
我过去这样做的方法是创建一个 UITabBarController
子类,其中包含您上面的所有 tabBar
创建代码。
然后使用您的UINavigationController
将tabBar
子类推送到屏幕上。
这是我的UITabBarController
子类的示例:
- (void)viewDidLoad
[super viewDidLoad];
UIViewController *view1 = [[UIViewController alloc] init];
UIViewController *view2 = [[UIViewController alloc] init];
UIViewController *view3 = [[UIViewController alloc] init];
NSMutableArray *tabViewControllers = [[NSMutableArray alloc] init];
[tabViewControllers addObject:view1];
[tabViewControllers addObject:view2];
[tabViewControllers addObject:view3];
[self setViewControllers:tabViewControllers];
//can't set this until after its added to the tab bar
view1.tabBarItem =
[[UITabBarItem alloc] initWithTitle:@"view1"
image:[UIImage imageNamed:@"view1"]
tag:1];
view2.tabBarItem =
[[UITabBarItem alloc] initWithTitle:@"view2"
image:[UIImage imageNamed:@"view3"]
tag:2];
view3.tabBarItem =
[[UITabBarItem alloc] initWithTitle:@"view3"
image:[UIImage imageNamed:@"view3"]
tag:3];
【讨论】:
【参考方案2】:设置委托UITabBarDelegate
这里是 TabBar Viewcontroller 图片 http://prntscr.com/ba5oks
#pragma mark- Tapbar delegate
- (void)deselectTabBarItem:(UITabBar*)tabBar
tabBar.selectedItem = nil;
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item
[self performSelector:@selector(deselectTabBarItem:) withObject:tabBar afterDelay:0.2];
switch (item.tag)
case 0:
//perform action
break;
case 1:
//do whatever you want to do.
break;
case 2:
//call method
break;
default:
break;
【讨论】:
以上是关于以编程方式将选项卡栏控制器添加到当前 App Flow的主要内容,如果未能解决你的问题,请参考以下文章
在启动时以编程方式为 5 个选项卡栏项目设置选项卡栏标题,其中 4 个嵌入在导航控制器中,1 个没有。目标 C
如何以编程方式使用 Swift 3 在所有视图控制器中显示选项卡栏?
添加到选项卡栏控制器时,列样式 UISplitViewController 无法正常工作