【问题标题】:How to know when user made change to settings bundle如何知道用户何时更改设置包
【发布时间】:2011-03-30 06:13:46
【问题描述】:

我让用户在 iphone 的设置区域中更改他们的设置。在下一次网络同步期间,我想将用户更改发送到服务器。但前提是进行了更改。

但我如何知道用户何时在设置区域内进行了更改?

如果可以的话,我想避免选择始终发送信息(无论是否更改)或首先从服务器获取信息并在与用户默认设置不同时进行更新。

有没有解决这个问题的好方法? 感谢您的帮助!

一周后,没有答案... 这个问题是不是太难了,还是根本没有任何意义?

【问题讨论】:

    标签: iphone settings-bundle


    【解决方案1】:

    啊,我太傻了!在这里,我们采用一种优雅的方式。在 XCode 中的 Apple 文档中搜索 AppPrefs,它将显示一个示例应用程序,该示例应用程序完全符合您的要求。只需编译并运行!它使用NSUserDefaultsDidChangeNotification

    这是用于注册观察者的代码:

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

    旧答案:

    您似乎无法从 NSUserDefaults 中获取修改日期。目前我只能这么想:

    NSUserDefaults *previousDefaults = [someInstance previousUserDefaults];
    NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
    
    if([previousDefaults isEqualToDictionary:currentDefaults]) 
    {
        [someOtherInstance sendModifiedUserDefaultsToServerWithDefaults:currentDefaults];
        [yetAnotherInstance saveModified]
    }
    

    当应用程序第一次启动时,您必须将用户默认值作为字典保存到磁盘:您的默认值。然后,每次打开应用程序时,您都会比较这两个词典。如果他们

    【讨论】:

    • 嗯。让我觉得有更好的方法是,当您更改 iphone 上的网络设置时,它会自动尝试查找并连接到它。这必须意味着用户设置更改已触发操作。这对我来说也是一个不错的解决方案。他们是怎么做到的?
    • 给你一个优雅而简单的解决方案。
    • 哦,是的!这很棒。但这会触发对设置的任何更改。有没有办法只对特定的属性更改采取行动?
    • 我认为我们处于可能性的底部。请查看 NSUserDefaults 类参考,它没有透露任何对我更有用的信息。但是,如果您找到方法,请在此处告知我们。
    • @Will 我不这么认为。无论如何,用户默认值是每个沙盒的,因此只能由应用程序本身更改。
    【解决方案2】:

    这不是问题太难,只是没有一种简单的方法可以完成您的要求。 NSUserDefaults 没有记录每个应用程序设置的“最后修改”日期,至少据我所知,所以如果用户使用设置应用程序更改了某些设置,除了查看所有设置。

    如果您确实需要这样做,我认为您最好的选择是读取您感兴趣的设置,以便同步到某个数据结构中并根据该结构计算某种哈希或校验和。将该值与您上次运行应用程序时计算的值进行比较,如果不同,则与服务器同步。如果需要,您可以将该值存储在 NSUserDefaults 中,但请确保不要将其包含在计算中。

    【讨论】:

    • 谢谢 Caleb。我不想让我的解决方案过于复杂。我很惊讶不需要这样的东西,而且库中没有任何东西可以支持这个想法,例如反应更改用户设置。
    • 通常,应用程序并不关心它的偏好最近是否发生了变化——它会在需要时从默认系统中读取它们,所以如果发生了变化,应用程序会自动获取新值.此外,NSUserDefaults 来自 MacOS X,在这种情况下,用户应该能够删除应用程序的首选项文件而不会产生不良影响;该应用程序应该回退到其内置默认值。即使在 iOS 上,我也不会在默认系统中存储关键信息。
    【解决方案3】:

    斯威夫特

    观察变化并在变化时调用方法:

    NotificationCenter.default.addObserver(
        self,
        selector: #selector(updateStateFromSettingsBundle),
        name: UserDefaults.didChangeNotification,
        object: nil
    )
    
    @objc func updateStateFromSettingsBundle() {}
    

    【讨论】:

      猜你喜欢
      • 2018-07-23
      • 1970-01-01
      • 1970-01-01
      • 2021-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 2019-12-28
      相关资源
      最近更新 更多