8

在我的 iPhone 应用程序中,为了恢复以前查看的选项卡,在启动时我设置了 setSelectedIndex:(也尝试了 setSelectedViewController:根据文档但无济于事)

这适用于 iPhone OS 3.0 - 但是在 OS 2.x 上,大于 3 的选定索引(前 4 个选项卡)不会切换到所需的视图。Apple 在这里记录了这一点: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 ..){ } 块中 - 希望这种技术可以帮助某人.

4

3 回答 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]];
            }
        }
于 2009-10-15T02:20:00.377 回答
2

我有这个在版本 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];
于 2009-07-08T01:43:45.170 回答
2

关于selectedIndex的 UITabBarController 文档说明了这一点:

此属性名义上表示属性数组的索引 viewControllers。但是,如果所选视图控制器当前是More导航控制器,则此属性包含 valueNSNotFound。设置此属性会将选定的视图控制器更改为 viewControllers数组中指定索引处的视图控制器。要选择 更多导航控制器本身,您必须改为更改 selectedViewController属性的值。

在 3.0 之前的 iPhone OS 版本中,此属性仅反映所选标签栏项目的索引。尝试将此值设置为在选项卡栏中不可见但由更多导航控制器管理的视图控制器的索引没有效果

如果我理解正确,您需要改为“更改selectedViewController属性的值”,但您只会选择更多导航控制器,而不是其中的 VC。来自有关selectedViewController的相同文档:

该视图控制器是标签栏界面当前显示其自定义视图的控制器。指定的视图控制器必须在 viewControllers数组中。为该属性分配一个新的视图控制器会更改当前显示的视图,并在选项卡栏中选择适当的选项卡。更改视图控制器也会 selectedIndex相应地更新属性。此属性的默认值为 nil

在 iPhone OS 3.0 和更高版本中,您可以使用此属性来选择 viewControllers属性中的任何视图控制器。这包括由更多导航控制器管理的视图控制器,其标签栏项目在标签栏中不可见。您还可以使用它来选择More 导航控制器本身,该控制器可从 moreNavigationController属性中获得。 在 iPhone OS 3.0 之前,您只能选择更多导航控制器和标签栏项目可见的视图控制器子集。尝试将此属性设置为标签栏项目不可见的视图控制器无效。

至于解决方法,我想知道更多导航控制器的pushViewController:animated:方法是否会在这里派上用场?给每个视图一个唯一的标签号(您可以在幕后将其与适当的 VC 关联)。保存最后激活的 VC 的标记。

在启动时,在标签栏控制器中选择适当的视图。如果视图的标签与前四个选项卡项的 VC 无关,则它必须位于更多导航控制器中。找到 VC,将其推送到更多导航控制器的堆栈中,然后直接选择更多导航控制器。

我还没有尝试过,但它可能值得一试!唯一潜在的问题(它可能是一个大问题)是您必须在设置更多导航控制器之后推送该 VC ,不是之前。

于 2009-08-19T12:28:43.797 回答