2014-10-31 118 views
0

在我的应用程序的设置部分,用户可以选择更改应用程序的语言。因此,当用户选择西班牙语作为他的主要语言时,应用程序会在他重新启动应用程序后显示西班牙语中的内容,但我想更改语言即时。这适用于像TableView这样的主要内容,因为我只是可以重新加载数据,但我的TabBarController中的语言不会更改,因为我不知道如何。切换语言后重新加载tabBarController

所以我想更新(或更好地称它为重置)TabBarController。重置后,它应该以新语言显示所有导航点。

我的想法是删除当前的TabBarController并初始化一个新的。这可能吗?或者,还有更好的方法?

回答

4

我不是母语为英语的人,所以如果我的解释不够清楚,请告诉我,我会尝试重新修饰它们。

由于我的帖子太长,可能看起来很可怕,也很复杂,但实际上并非如此,只是因为我认为最好还是解释如何去做,而不仅仅是给出几行码。

你可以使用UITabBarController属性来实现你想要的。

UITabBarController有一个属性tabBar,这是实际的UITabBar
有人可能会认为,为了实现你想要的,你应该编辑这个属性,
然而,编辑这个属性会导致一个异常。
从苹果公司的UITabBarController文档,关于tabBar属性:

You should never attempt to manipulate the UITabBar object itself stored in 
this property. If you attempt to do so, the tab bar view throws an exception. 

所以,你不应该试图在运行时编辑此属性。

警告这个词的,这里是你应该做 - 什么
UITabBarController也有一个名为viewControllers属性,它是一个NSArray谁拥有参考该由标签栏显示的视图控制器。
该属性可以在运行时修改,并且应用于其的更改在选项卡栏中立即更新。
但是,对于您的情况,您无需修改​​此属性,
但我认为您应该知道,因此如果在某些情况下需要添加或删除标签栏中的某些项目,您会知道那可以做到。

你想要做的是遍历该数组的对象来访问视图控制器本身。

UIViewController有一个名为tabBarItem的属性,它代表视图控制器的UITabBarItem
所以我们基本上做的是获取视图控制器的标签栏项目,但不是从UITabBarController本身获取它,而是直接从每个视图控制器获取它。
每个UITabBarItem有一个title财产,这是你想改变。

所以现在,在那么长的介绍之后,我们来看实际的代码。
我觉得一个很简单的方法来实现你想要的是迭代通过viewControllers数组,并有一些switch语句在那里,将改变标题。
与任何编程情况一样,这可以通过无数其他方式完成,因此您可能有更好的方式来实现它,而不是下面的示例,但这应该可以做到。

正被显示在选项卡栏控制器每个视图控制器,具有使用属性tabBarController
所以可以在任意正被显示在选项卡栏视图控制器的运行此代码到该标签条的引用,并只需使用self.reference即可获得对其的引用。

添加的语言后,这个地方有更改─

for (int i = 0; i < [self.tabBarController.viewControllers count]; i++) { 
    if([self.tabBarController.viewControllers[i] isKindOfClass: [UIViewController class]]) { 
     UIViewController *vc = self.tabBarController.viewControllers[i]; 
     switch(i) { 
      case 0: 
       vc.tabBarItem.title = @"primero"; 
       break; 
      case 1: 
       vc.tabBarItem.title = @"secondo"; 
       break; 
     } 
    } 
} 

我们基本上做的,正在运行for循环,迭代通阵列中所有的项目,
数组中的项目按照它们出现在标签栏
的顺序,然后我们使用switch语句在相应的位置更改视图控制器的标题
由于数组的索引为0,第一个视图控制器位于位置i = 0,最后一个小于0 f数组中的项目。
有人可能会说我的if是不必要的,
既然我们已经知道,这个数组只保存视图控制器,没有必要检查是否该位置的产品UIViewController类,或者它的子类。
他们可能是对的,但我总是说最好是安全而不是抱歉。

诅咒我还会在你的代码中包含一些东西来实际检查用户选择的语言。
上面的示例将标题更改为西班牙语,而不管用户的选择如何。

希望它能帮助队友,
好运

+0

感谢您详细的解答!没问题看它:)我检查它,但我认为,这将解决我的问题:)非常感谢你! – emha 2014-11-01 12:19:04