我正在尝试在UITabBar.viewControllers数组中选择一个UINavigationControllers。
我之前尝试过设置UITabbarController.selectedIndex,但Apple文档说: “要选择更多导航控制器本身,您必须改为更改selectedViewController属性的值。”
AppDelegate *appDelegate = (AppDelegate*)[UIApplication sharedApplication].delegate;
UINavigationController *navController = [appDelegate.objTabBarController.viewControllers objectAtIndex:5];
[appDelegate.objTabBarController setSelectedViewController:navController];
这样做很好但是当我改回到MoreViewController的列表视图时,左侧的图标消失了,不会再回来。
一切都好,用手指选择。
以编程方式选择时出错 - >图像消失了
有什么建议我做错了吗?
祝你好运, 史蒂夫
答案 0 :(得分:1)
选择更多导航控制器
要选择moreNavigationController,您必须设置selectedViewController
:
self.tabBarController.selectedViewController = self.tabBarController.moreNavigationController;
原因很简单:moreNavigationController不在标签栏控制器的viewControllers
内,因此无法通过索引选择它。
要直接选择其中一个“更多”控制器,您可以设置selectedViewController
属性:
self.tabBarController.selectedViewController = viewController5;
或者您可以设置selectedIndex
:
self.tabBarController.selectedIndex = 5;
修复消失的标签栏图像
消失的标签栏图像是由导航控制器内部的导航控制器(用于设置)(标签栏控制器生成的moreNavigationController
)引起的。要解决这个问题,有两种解决方案:
不要为更多部分添加导航控制器,而是直接添加控制器。假设所有选项卡中的控制器都需要导航,控制器结构将如下所示:
tabBarController
+ navigationController
+ viewController0
+ navigationController
+ viewController1
+ navigationController
+ viewController2
+ navigationController
+ viewController3
+ viewController4
+ viewController5
在导航控制器上设置设置控制器的tabBarItem
(您只需要执行一次):
UINavigationController *settingsNavigationController = [appDelegate.objTabBarController objectAtIndex:5];
UIViewController *settingsRootController = settingsNavigationController.viewControllers[0];
settingsNavigationController.tabBarItem = settingsRootController.tabBarItem;
答案 1 :(得分:0)
我遇到了同样的问题。似乎导航控制器以某种方式失去了视图控制器的跟踪。在我的例子中,图像消失的导航控制器位于tabBarController的索引7处。导航控制器应该包含类SettingsViewController的viewController。但有时却失去了它。
要修复它,我必须将代码添加到两个类 - app delegate和SettingsViewController。在app delegate中:
-(void) fixSettingsNavigationController {
UITabBarController* tab = self.tabBarController;
NSArray* vcs = tab.viewControllers;
NSInteger nVCs = vcs.count;
if (nVCs > 7) {
UIViewController* settingsContainer = vcs[7];
UINavigationController* settingsContainerNav = (UINavigationController*)settingsContainer;
if ([settingsContainerNav isKindOfClass: [UINavigationController class]]) {
NSArray* settingsNavVCs = settingsContainerNav.viewControllers;
NSInteger count = settingsNavVCs.count;
SettingsViewController* svc = self.settingsViewController;
if (!count) {
// The container navigation controller has lost track of the settings view controller.
settingsContainerNav.viewControllers = [NSArray arrayWithObject:svc];
}
}
}
}
在SettingsViewController中:
-(void) viewWillDisappear:(BOOL)animated {
MyAppDelegate* appDel = [[UIApplication sharedApplication] delegate];
[appDel fixSettingsNavigationController];
[super viewWillDisappear: animated];
}
答案 2 :(得分:0)
我遇到了非常类似的情况,我想以编程方式在MoreViewController中选择一个View控制器。
正如您在问题中所说,Apple不允许选择MoreViewController内部的视图控制器(或者在tabbar中不可见)。
在我的情况下,我不需要在tabbar中重新排序选项卡的默认“更多”功能。
所以,我做了以下事情
创建了一个UITableViewControlelr作为我的第五个标签,将其标题设置为更多和自定义图像(类似于默认的更多图像)。
在我的UITableViewController中,我列出了与ViewControllers对应的项目。点击哪个显示相应的视图控制器。
当我需要以编程方式显示我的UITableViewController中的任何视图控制器时,我只需设置一个标志并按下我的UITableViewController,并在我的UITableViewController的viewDidAppear方法中推送所需的视图控制器。
这也将以编程方式打开的视图显示返回按钮,以列出MoreViewController