如何在iOS9中更改应用程序的语言而无需重新启动应用程序?

问题描述:

当我使用设备语言独立更改应用程序的语言时,仅在重新启动它时才起作用。我已经根据堆栈溢出的答案尝试了几次,例如:如何在iOS9中更改应用程序的语言而无需重新启动应用程序?

#import "NSBundle+Language.h" 

#import <objc/runtime.h> 

static const char _bundle=0; 

@interface BundleEx : NSBundle 
@end 

@implementation BundleEx 
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName 
{ 
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle); 
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName]; 
} 
@end 

@implementation NSBundle (Language) 

+(void)setLanguage:(NSString*)language 
{ 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken,^
        { 
         object_setClass([NSBundle mainBundle],[BundleEx class]); 
        }); 
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 

} 

@end 

但不生效。

当应用程序的设置屏幕中的语言发生变化时,我发布了一个通知,那些听取通知的人将重新加载视图,但没有工作,语言只是没有改变。

+0

iOS不支持重新启动应用程序功能。只要语言发生变化,您就可以随时更新它。所有其他UI(需要更改语言的地方)应该在特定视图的'viewWillAppear:'方法内更新。是的,**这个问题不是iOS9特有的。** – Hemang

您的代码在我的演示中工作,只需设置另一种语言,并执行类似于重新加载可见视图的操作。

+0

是的,问题已经解决了,就像你说的那样。 –