使用UITabBar切换到另一个视图

时间:2010-09-03 01:38:42

标签: iphone objective-c ios4 uitabbar

我刚刚开始使用iPhone SDK进行开发,我在使用UITabBar切换到另一个标签时出现问题。

这是我目前的代码,到目前为止一直有效:

myAppAppDelegate *appDel = (myAppAppDelegate *)[[UIApplication sharedApplication] delegate]
[appDel.tabBar setSelectedViewController:[appDel.tabBar.viewControllers objectAtIndex:5]];

但是,如果我转到更多选项卡并重新排列tabbar项,viewControllers的索引也会更改。我有什么可能解决这个问题的方法吗?

2 个答案:

答案 0 :(得分:0)

最直接的意思是我可以想到这样一个事实,即当你的应用程序第一次启动时,除非你正在做一些事情来保存重新排序,你可以保存UIViewControllers的初始列表:

initialOrdering = [[appDel.tabBar viewControllers] copy];

其中'initialOrdering'是一个NSArray *,然后您将在您发布的代码中使用而不是appDel.tabBar.viewControllers。

答案 1 :(得分:0)

首先,如果你发现自己输入了这个:

(myAppAppDelegate *)[[UIApplication sharedApplication] delegate]

您可以从更好的设计中受益。此代码可能来自视图控制器,在这种情况下,您从视图控制器调用App委托,并处理您不应该知道的内容(标签栏)。

更好的设计是委托给app代理,app委托为你切换标签。应用程序委托应该引用标签栏中的实际视图控制器(如果没有,你可以通过IB挂钩),这样你就可以用正确的对象调用setSelectedViewController:,而不是索引到标签栏的数组: / p>

/* Somewhere in the app delegate */
- (void)selectFooBarController {
    [self.tabBar setSelectedViewController:self.fooBarController];
}

现在,如果您不想打扰委托,可以在app委托上添加一个方法(如上所述),原始代码就变成了:

myAppAppDelegate *appDel = (myAppAppDelegate *)[[UIApplication sharedApplication] delegate]
[appDel selectFooBarController];

同样,您需要将IBOutlet属性添加到您在Interface Builder中连接到fooBarController等的app委托。这将让你直接引用它们,而不是从阵列中抓取它们。