UITabBar UITableView中的MoreViewController图像在以编程方式选择后消失

时间:2012-10-07 10:26:51

标签: iphone ios image uinavigationcontroller uitabbar

我正在尝试在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的列表视图时,左侧的图标消失了,不会再回来。

一切都好,用手指选择。

Selecting is fine

以编程方式选择时出错 - >图像消失了

Per Code Step 1 Per Code Step 2 Per Code Step 3

有什么建议我做错了吗?

祝你好运, 史蒂夫

3 个答案:

答案 0 :(得分:1)

选择更多导航控制器

要选择moreNavigationController,您必须设置selectedViewController

self.tabBarController.selectedViewController = self.tabBarController.moreNavigationController;

原因很简单:moreNavigationController不在标签栏控制器的viewControllers内,因此无法通过索引选择它。

要直接选择其中一个“更多”控制器,您可以设置selectedViewController属性:

self.tabBarController.selectedViewController = viewController5;

或者您可以设置selectedIndex

self.tabBarController.selectedIndex = 5;

修复消失的标签栏图像

消失的标签栏图像是由导航控制器内部的导航控制器(用于设置)(标签栏控制器生成的moreNavigationController)引起的。要解决这个问题,有两种解决方案:

  1. 不要为更多部分添加导航控制器,而是直接添加控制器。假设所有选项卡中的控制器都需要导航,控制器结构将如下所示:

    tabBarController
    + navigationController
      + viewController0
    + navigationController
      + viewController1
    + navigationController
      + viewController2
    + navigationController
      + viewController3
    + viewController4
    + viewController5
    
  2. 在导航控制器上设置设置控制器的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中重新排序选项卡的默认“更多”功能。

所以,我做了以下事情

  1. 创建了一个UITableViewControlelr作为我的第五个标签,将其标题设置为更多和自定义图像(类似于默认的更多图像)。

  2. 在我的UITableViewController中,我列出了与ViewControllers对应的项目。点击哪个显示相应的视图控制器。

  3. 当我需要以编程方式显示我的UITableViewController中的任何视图控制器时,我只需设置一个标志并按下我的UITableViewController,并在我的UITableViewController的viewDidAppear方法中推送所需的视图控制器。

  4. 这也将以编程方式打开的视图显示返回按钮,以列出MoreViewController