我刚刚开始使用iPhone SDK进行开发,我在使用UITabBar切换到另一个标签时出现问题。
这是我目前的代码,到目前为止一直有效:
myAppAppDelegate *appDel = (myAppAppDelegate *)[[UIApplication sharedApplication] delegate]
[appDel.tabBar setSelectedViewController:[appDel.tabBar.viewControllers objectAtIndex:5]];
但是,如果我转到更多选项卡并重新排列tabbar项,viewControllers的索引也会更改。我有什么可能解决这个问题的方法吗?
答案 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委托。这将让你直接引用它们,而不是从阵列中抓取它们。