以编程方式快速重新加载应用程序

Diy*_*yaa 5 ios swift

我为我的故事板(英语、阿拉伯语)创建了本地化,并执行了更改(切换)应用程序的功能。语言(本地)如果我手动重新启动(重新启动)应用程序并且我的视图翻转右让(如果阿拉伯语)和左-右(如果英语),它工作完美,但是如何在不手动重新启动我的应用程序的情况下更改故事板本地?

我用这个功能来改变语言

 func setLocale(langCode:String){

    NSUserDefaults.standardUserDefaults().setObject([langCode], forKey: "AppleLanguages")
    NSUserDefaults.standardUserDefaults().synchronize()

}
Run Code Online (Sandbox Code Playgroud)

预先感谢。

Bha*_*ain 3

这就是你可以做的。然而这段代码是用 Obj-C 编写的。

为 NSBundle 创建一个类别类,如下所示:

#import "NSBundle+ForceLocalization.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 (ForceLocalization)

+(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
Run Code Online (Sandbox Code Playgroud)

之后,只需调用:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: langCode, nil]
                                                  forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
[NSBundle setLanguage: langCode];
Run Code Online (Sandbox Code Playgroud)

您需要再次重新加载当前屏幕的 UI。如果您继续使用另一个控制器,您将看到更新的语言。