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