【问题标题】:Update UI after language change on NSUserDefaults在 NSUserDefaults 上更改语言后更新 UI
【发布时间】:2014-02-21 07:29:41
【问题描述】:

我创建了一个语言选择屏幕,用户可以在其中选择应用 (iPad) 的首选语言。

我这样提交语言更改:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"fr"] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize];

它运行良好,只是需要重新启动应用程序才能使 UI 采用新的语言设置。根据 Apple 的文档:

为了检测偏好值何时发生变化,应用还可以 注册通知 NSUserDefaultsDidChangeNotification。这 共享的 NSUserDefaults 对象将此通知发送到您的应用 每当它检测到位于其中一个的首选项发生变化时 持久域。您可以使用此通知来回复 可能会影响您的用户界面的更改。例如,您可以 使用它来检测对用户首选语言的更改并更新 适当的应用内容。

看来我需要注册通知 NSUserDefaultsDidChangeNotification 并更新我的 UI。哪个班级应该收听通知?知道代码是什么样的吗?我的应用基于 SKScenes 和 Sprite Kit 对象,而不是 xib 和 UIViewControllers。

【问题讨论】:

    标签: ios ios7 internationalization


    【解决方案1】:

    通过观看 NSNotificationCenter 可以检测到所有通知:

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
           selector:@selector(userDefaultsChange:)  
               name:NSUserDefaultsDidChangeNotification
             object:nil];
    
    - (void)userDefaultsChange:(NSNotification *)notification {
         //update UI to new language here
    }    
    

    在创建类时添加观察者,并记住在删除类时必须将其删除。

    [[NSNotificationCenter defaultCenter] removeObserver:self];
    

    【讨论】:

    • 你能解释一下你的答案吗?虽然他们被允许只提供代码并且不解释自己的答案不是很好的答案。顺便说一句,我对提出问题的人更了解,因为如果他们明白,他们就不会问了。
    • 我添加了一些描述,我认为没有必要但我解释了一下
    • 如果他们明白自己在做什么,那么他们就不会问这个问题。所以仅仅提供代码并不能告诉他们任何事情,也不能帮助他们学习。这么说吧看懂代码???
    • 谢谢@GrzegorzKrukowski。但是,如何在考虑新语言的情况下更新 UI?我正在寻找注释的实现: //update UI to new language here 我想要 SKSpriteNodes 和所有其他本地化对象(图像、字符串),它们初始化为:使用 initWithImageNamed 或 nslocalizedstring 重绘新的语言设置。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    相关资源
    最近更新 更多