Ios 切换语言后重新加载Tabbar控制器

Ios 切换语言后重新加载Tabbar控制器,ios,objective-c,uinavigationcontroller,uitabbarcontroller,Ios,Objective C,Uinavigationcontroller,Uitabbarcontroller,在“我的应用”的“设置”部分,用户可以选择更改应用的语言。因此,当用户选择西班牙语作为主要语言时,在重新启动应用程序后,应用程序将以西班牙语显示内容,但我想动态更改语言。这适用于主要内容,如TableView,因为我可以简单地重新加载数据,但是TabBarController中的语言不会更改,因为我不知道如何更改 因此,我想更新(或者更好地称之为重置)选项卡控制器。重置后,应以新语言显示所有导航点 我的想法是删除当前的TabBarController,并初始化一个新的。这可能吗?或者有更好的方法

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

因此,我想更新(或者更好地称之为重置)选项卡控制器。重置后,应以新语言显示所有导航点


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

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

由于我的帖子很长,它可能看起来很吓人,也很复杂,但事实并非如此,它很长,因为我认为最好也解释一下如何做,而不是只给出几行代码

您可以使用
UITabBarController
properties实现您想要的功能

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
本身获取它,而是直接从每个视图控制器获取它。
每个
uitabaritem
都有一个
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(int i=0;i<[self.tabBarController.viewControllers count];i++{
如果([self.tabBarController.viewControllers[i]是类:[UIViewController类]]){
UIViewController*vc=self.tabBarController.ViewController[i];
开关(i){
案例0:
vc.tabBarItem.title=@“primero”;
打破
案例1:
vc.tabBarItem.title=@“secondo”;
打破
}  
}  
}
我们基本上要做的是为运行一个循环,循环遍历数组中的所有项,
数组中的项目与它们在选项卡栏上的显示顺序相同,
然后,我们使用switch语句更改视图控制器在相应位置的标题,
由于数组的索引为0,因此第一个视图控制器位于位置i=0,最后一个视图控制器位于比数组中的项目数少1的位置。
有些人可能会争辩说,如果我的
没有必要,
由于我们已经知道此数组仅包含视图控制器,因此无需检查该位置的项是否属于
UIViewController
类或其子类。
他们可能是对的,但我总是说安全总比后悔好

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

希望它能帮助mate,

祝你好运

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

由于我的帖子很长,它可能看起来很吓人,也很复杂,但事实并非如此,它很长,因为我认为最好也解释一下如何做,而不是只给出几行代码

您可以使用
UITabBarController
properties实现您想要的功能

UITabBarController
有一个名为
tabBar
的属性,它是实际的
UITabBar

有人可能会认为,为了实现您想要的,您应该编辑此属性,
//  MARK: - UITabBarController
extension UITabBarController {
    func changeTitleLocale() {
        guard let viewContollers = self.viewControllers else { return }
        for (index, navVC) in viewContollers.enumerated() {
            if let view = navVC as? UINavigationController {
                if let topView = view.topViewController {
                    if topView.isKind(of: ProfileVC.self) {
                        self.tabBar.items?[index].title = "tab_profile"
                    } else if topView.isKind(of: ChatVC.self) {
                        self.tabBar.items?[index].title = "tab_chat"
                    } else if topView.isKind(of: PicturesVC.self) {
                        self.tabBar.items?[index].title = "tab_pictures"
                    } else if topView.isKind(of: VideosVC.self) {
                        self.tabBar.items?[index].title = "tab_videos"
                    }
                }
            }
        }
    }
}

self.tabBarController?.changeTitleLocale()