在swift中以编程方式重新加载应用程序

时间:2016-10-14 17:13:00

标签: ios swift

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

我用这个函数来改变语言

          String body = msgs[i].getMessageBody();

提前感谢。

2 个答案:

答案 0 :(得分:2)

这是你可以做的。但是这段代码在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

在此之后,只需致电:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects: langCode, nil]
                                                  forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];
[NSBundle setLanguage: langCode];

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

答案 1 :(得分:0)

我今天正在寻找相同的答案但我无法找到它,但我使用了这段代码

let vc = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        UIApplication.shared.keyWindow?.rootViewController = vc

重新加载主视图控制器,它做了一些如何重新启动应用程序,虽然连接到故事板的视图存在一些问题,我从superView中删除了它们...