【问题标题】:NSUserDefault and SwitchesNSUserDefault 和开关
【发布时间】:2013-01-07 03:30:32
【问题描述】:

我使用 NSUserDefaults 来保存开关,到目前为止它很好。它会记住下一个会话中的开关位置。

现在谈谈我不明白的事情。 我在另一个视图中使用相同的开关(具有相同的名称),比如说从第一个视图推入的翻转视图。如果我在第一个视图中更改开关,它会在翻转视图中自动更改。 但反过来说,如果我在翻转视图中更改它,当我返回时,它不会在第一个视图中更改。仅当我重新启动应用程序时,第一个视图也会更改。

我怎样才能解决这个同时改变?或者无需重新启动即可刷新第一个视图。

【问题讨论】:

    标签: objective-c xcode switch-statement store nsuserdefaults


    【解决方案1】:

    您的第一个视图没有刷新,因为它没有再次初始化。如果您使用 ViewControllers,您可以在 viewWillAppear 中更新您的开关(如果 isViewLoaded)。

    【讨论】:

    • 我使用了 UIBarButtonItem 和 @selector(refresh) 然后 - (void)refresh 并放入 BOOL savedState 中以用于相关的开关。因此,按下按钮,它再次通过 savedStates 运行,它们被更新。它有效。
    【解决方案2】:

    您应该观察NSUserDefaults对更改感兴趣的视图的更改。

    您可以使用以下代码来观察变化:

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center addObserver:self
               selector:@selector(defaultsChanged:)  
                   name:NSUserDefaultsDidChangeNotification
                 object:nil];
    

    并实现defaultsChanged方法:

    - (void)defaultsChanged:(NSNotification *)notification
    {
        NSUserDefaults *defaults = (NSUserDefaults *)[notification object];
        id value = [defaults objectForKey:@"keyOfDefaultThatChanged"];
        self.something = [(NSNumber *)value intValue];    // For example.
    }
    

    不要忘记在视图关闭时移除观察者(可能在dealloc):

    NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
    [center removeObserver:self];
    

    【讨论】:

    • 谢谢,可以检查。我有很多对改变感兴趣的观点。
    猜你喜欢
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多