ios - 切换语言后重新加载 tabBarController

标签 ios objective-c uinavigationcontroller uitabbarcontroller

在我的应用程序的设置部分,用户可以选择更改应用程序的语言。所以当用户选择西类牙语 作为他的主要语言,该应用程序以西类牙语显示内容在他重启应用后但我想更改语言在飞行中 .这适用于主要内容,如 TableView 因为我可以简单地重新加载数据,但我的 中的语言TabBarController 不会改变,因为我不知道如何。

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

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

最佳答案

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

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

您可以使用UITabBarController 来实现您想要的。特性。
UITabBarController有一个名为 tabBar 的属性,这是实际的 UITabBar .
有人可能会认为,为了实现你想要的,你应该编辑这个属性,
但是,编辑此属性会导致异常。
来自苹果的UITabBarController文档,关于 tabBar属性(property):

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谁持有对标签栏显示的 View Controller 的引用。
此属性可以在运行时修改,并且应用到它的更改会立即在选项卡栏中更新。
但是,对于您的情况,您不需要修改此属性,
但我认为您应该知道这一点,因此如果在某些情况下您需要从标签栏中添加或删除某些项目,您就会知道可以做到这一点。

您想要做的是遍历该数组的对象以访问 View Controller 本身。
UIViewController有一个名为 tabBarItem 的属性代表UITabBarItem的 View Controller 。
所以我们基本上在做的是获取 View Controller 的标签栏项目,而不是从 UITabBarController 获取它。本身,我们直接从每个 View Controller 获取它。
每个UITabBarItem有一个 title属性,这就是你想要改变的。

所以现在,经过这么长的介绍,让我们来看看实际的代码。
我认为实现您想要的一个非常简单的方法是遍历 viewControllers数组,并在其中有一些会改变标题的 switch 语句。
与任何编程情况一样,这可以通过无数其他方式完成,因此您可能有比我下面的示例更好的方法来实现它,但这应该可以解决问题。

在标签栏 Controller 中显示的每个 View Controller 都使用属性 tabBarController 对该标签栏进行引用。
因此,您可以在选项卡栏中显示的任何 View Controller 中运行此代码,并且只需使用 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 语句来改变 View Controller 在相应位置的标题,
由于数组的索引为 0,所以第一个 View Controller 的位置 i=0,最后一个 View Controller 的位置比数组中的项目数少一个。
有些人可能会争辩说我的if是不必要的,
由于我们已经知道这个数组只包含 View Controller ,因此无需检查该位置的项目是否为UIViewController。类,或者它的子类。
他们可能是对的,但我总是说安全总比后悔好。

当然,我还会在您的代码中包含一些内容,以实际检查用户选择的语言。
上面的示例将标题更改为西类牙语,而不管用户的选择如何。

希望对小伙伴有帮助
祝你好运

关于ios - 切换语言后重新加载 tabBarController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683260/

相关文章:

ios - 尝试设置非属性列表对象 - NSUserDefaults

ios - 如何将 UIView 移动到 "bottom"以便显示下一个 UIView?

ios - 从 AppDelegate 重定向到特定屏幕 : On tap Notification

ios - 如何在 Swift Xcode 中创建自定义导航栏?

ios - Html5 音频播放器不会在使用 meteor 的 iOS 应用程序中显示

iOS - UIBezierPath 使起始角度始终垂直

ipad - UIActionSheet cancelButtonTitle iPad

ios - NSAutoLayoutConstraints 崩溃的应用程序

iphone - iOS 7 中导航 Controller 及其 Root View Controller 的奇怪行为

ios - popToViewController 后 pushViewController 上的应用程序崩溃