切换语言后重新加载tabBarController

emh*_*mha 1 objective-c uitabbarcontroller uinavigationcontroller ios

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

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

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

AMI*_*289 6

我不是母语为英语的人,所以如果我的解释不够清楚,那就告诉我,我会试着改写它们.

由于我的长篇文章,它可能看起来很可怕和复杂,但它确实不是,它只是很长,因为我认为最好也解释如何做到这一点,而不是仅仅给出几行代码.

您可以使用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.  
Run Code Online (Sandbox Code Playgroud)

因此,您永远不应该尝试在运行时编辑此属性.

在这个警告之后,这是你应该做的 -
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;  
        }  
    }  
}
Run Code Online (Sandbox Code Playgroud)

我们基本上正在做的是运行for循环,迭代遍历数组中的所有项目.数组中
的项目与它们在选项卡栏上显示的顺序相同,
然后我们使用switch语句更改标题视图控制器位于相应的位置,
由于数组的索引为0,因此第一个视图控制器位于i = 0的位置,最后一个视图控制器的位置小于数组中的项目数.
有些人可能认为我if是不必要的,
因为我们已经知道这个数组只包含视图控制器,所以不需要检查该位置的项是属于UIViewController类,还是它的子类.
他们可能是对的,但我总是说安全比抱歉更好.

诅咒我还会在你的代码中包含一些实际检查用户选择的语言的东西.
无论用户选择什么,上面的示例都会将标题更改为西班牙语.

希望它有助于交配,
祝你好运