UITabBarController:如何通过编程切换到不同的视图控制器

9
在我的iPhone应用中,为了恢复之前查看的选项卡,在启动时我设置了setSelectedIndex:(也尝试过根据文档设置setSelectedViewController:但无济于事)
这在iPhone OS 3.0上运行正常 - 然而在OS 2.x上,大于3的选定索引(前4个选项卡)不会切换到所需的视图。苹果在此处有记录:http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/selectedViewController 我想知道是否可能在iPhone OS 2.x下切换到视图控制器?任何帮助都将不胜感激。
顺便说一句,在我的模拟器上设置大于3的索引会抛出错误(对于iPhone OS 2.x) - 因此我已将其包装在@try {..} @catch(id..){}块中 - 希望这种技术能够帮助某些人。
3个回答

7
也许这会有所帮助。我的做法是保存选中的标签栏项目的索引。当应用程序启动时,我会检查数字是否大于3,如果是,则将选择的标签栏视图控制器设置为更多导航控制器,然后从更多导航控制器中推送保存的索引标签栏视图控制器。
if ([[WSFUserDefaults sharedInstance] savedTabBarLocation] > 0) {

            if ([[WSFUserDefaults sharedInstance] savedTabBarLocation] > 3) {
                UIViewController *selectViewController = [tabBarController.viewControllers objectAtIndex:[[WSFUserDefaults sharedInstance] savedTabBarLocation]];
                [tabBarController setSelectedViewController:tabBarController.moreNavigationController];
                [tabBarController.moreNavigationController popToRootViewControllerAnimated:NO];//make sure we're at the top level More
                [tabBarController.moreNavigationController pushViewController:selectViewController animated:NO];
            }
            else {
                [tabBarController setSelectedIndex:[[WSFUserDefaults sharedInstance] savedTabBarLocation]];
            }
        }

这个很好运行。当你设置selectedIndex时会出现的情况是使用更多控制器而不是原始导航控制器,然后动态切换回去。这段代码完成了初始设置并确保视图控制器的导航控制器指针正确。 - Steve Weller
嗯,它运行良好,只有一个问题:更多屏幕上的编辑按钮消失了。 - Steve Weller

2

我已在第二版本上做到了这一点。

我的代码就在这里,非常可爱地运作着。

- (void)applicationDidFinishLaunching:(UIApplication *)application {

// Add the tab bar controller's current view as a subview of the window
[[UIApplication sharedApplication] setIdleTimerDisabled:YES];

[application setStatusBarStyle:UIStatusBarStyleBlackOpaque];
[window addSubview:tabBarController.view];
// Settings getLastViewIndex is just, 0,1,2,3 depending on what it was last set.
tabBarController.selectedIndex = [Settings getLastViewIndex];

是的,在iPhone OS 2.x中设置selectedIndex属性可以生效,但如果索引大于3,则无法生效。我的iPhone应用程序有超过12个选项卡。 - Ionic Walrus

2
UITabBarController文档中关于selectedIndex的解释如下:
这个属性通常代表viewControllers属性数组中的索引。然而,如果所选视图控制器当前是“更多”导航控制器,则该属性包含值NSNotFound。设置此属性将选定的视图控制器更改为viewControllers数组中指定索引处的视图控制器。要选择“更多”导航控制器本身,您必须改变selectedViewController属性的值。
在iPhone OS 3.0之前的版本中,该属性仅反映所选选项卡栏项目的索引。尝试将此值设置为在选项卡栏中不可见但由“更多”导航控制器管理的视图控制器的索引无效。
如果我理解正确,您需要改变selectedViewController属性的值,但只能选择“更多”导航控制器,而不能选择其中的视图控制器。从关于selectedViewController的同一文档中可以得知:
此视图控制器是当前由选项卡栏界面显示其自定义视图的视图控制器。指定的视图控制器必须在viewControllers数组中。将新的视图控制器分配给此属性会更改当前显示的视图,并选择适当的选项卡。更改视图控制器还会相应地更新selectedIndex属性的值。此属性的默认值为nil。
在iPhone OS 3.0及更高版本中,您可以使用此属性选择viewControllers属性中的任何视图控制器。这包括由“更多”导航控制器管理且其选项卡栏项目在选项卡栏中不可见的视图控制器。您还可以使用它来选择“更多”导航控制器本身,该导航控制器可从moreNavigationController属性中获得。在iPhone OS 3.0之前,您只能选择“更多”导航控制器和其选项卡栏项目可见的子集视图控制器。尝试将此属性设置为选项卡栏项目不可见的视图控制器将无效。
关于解决方法,我想知道是否可以使用 More 导航控制器的 pushViewController:animated: 方法?给每个视图分配一个唯一的标签号(你可以在背后与相应的 VC 关联)。保存最后活动的 VC 的标签。
在启动时,在选项卡控制器中选择适当的视图。如果该视图的标签未与前四个选项卡项目的 VC 相关联,则必须位于 More 导航控制器中。找到 VC,将其推入 More 导航控制器的堆栈中,然后直接选择 More 导航控制器。
我没有尝试过这个方法,但它可能值得一试!唯一可能出现的问题(而且可能是个大问题)是,在设置好 More 导航控制器之后才能推送该 VC,而不是在之前。

1
这个解释帮了很多忙。如果选项卡的数量大于5且selectedIndex>5,则仅设置selectedIndex是不起作用的。但是将selectedViewController设置为viewController就像魔法一样奏效。 - Krishna Vedula

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接