【问题标题】:How do I synchronize app preferences in Swift?如何在 Swift 中同步应用首选项?
【发布时间】:2014-12-15 17:10:02
【问题描述】:

以前,在一个 Objective-C 应用程序中,我需要在启动时在应用程序委托中同步我的 iOS 应用程序首选项。这允许在启动时进行适当的偏好设置。我使用了以下代码(注意原始帖子的链接):

# https://www.inkling.com/read/learning-ios-programming-alasdair-allan-2nd/chapter-12/application-preferences
+ (void)initialize {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *settingsBundle = [[NSBundle mainBundle] pathForResource:@"Settings"
                                                               ofType:@"bundle"];
    NSDictionary *settings = [NSDictionary dictionaryWithContentsOfFile:[settingsBundle
                                                                         stringByAppendingPathComponent:@"Root.plist"]];

    NSArray *preferences = [settings objectForKey:@"PreferenceSpecifiers"];
    NSMutableDictionary *defaultsToRegister = [[NSMutableDictionary alloc] initWithCapacity:[preferences count]];

    [defaults registerDefaults:defaultsToRegister];
    [defaults synchronize];
}

是否有人知道 Swift 中的等价物,或者 - 你能告诉我如何将上述代码转换为 Swift。

__

我修复了 ZAZ 的代码。与 Objective-C 类方法(以 + 开头)等效的是 Swift 类型方法,它由 'func override' 关键字之前的 'class' 关键字标识。我确认使用以下代码为 appDelegate 正确调用了 initialize()。

虽然,在我的 iPhone 上重新加载我的应用程序并启动设置后,Apple 的“允许 xxx 访问”设置仍然存在,但我的“xxx 设置”丢失了。如果我点击设置上的返回箭头,然后再次单击我的应用程序设置 - 我的应用程序设置现在存在并且可用于后续启动。

我从手机中删除了 Apple Numbers 应用程序,然后重新加载并启动了设置。 Numbers 应用程序在首次启动时提供所有设置。因此,存在某种形式的初始加载和/或缓存问题。对此的任何帮助将不胜感激。

class override func initialize() {
    if let settingsBundle = NSBundle.mainBundle().pathForResource("Settings", ofType: "bundle") {
      let settings = NSDictionary(contentsOfFile: settingsBundle.stringByAppendingPathComponent("Root.plist"))
      let preferences = settings?.objectForKey("PreferenceSpecifiers") as NSArray
      let defaultsToRegister = NSMutableDictionary(capacity: preferences.count)

      let defaults = NSUserDefaults.standardUserDefaults()
      defaults.registerDefaults(defaultsToRegister)
      defaults.synchronize()
    }
}

【问题讨论】:

  • 不就是defaults.synchronize()吗?

标签: ios appsettings


【解决方案1】:

我已经修改了你的代码,请试一试,希望这次能成功

func initialize() {
    let defaults = NSUserDefaults.standardUserDefaults()
    let settingsBundle = NSBundle.mainBundle().pathForResource("Root", ofType: "plist")
    let settings = NSDictionary(contentsOfFile: settingsBundle!)

    let preferences = settings?.objectForKey("PreferenceSpecifiers") as NSArray

    let defaultsToRegister = NSMutableDictionary(capacity: preferences.count)

    defaults.registerDefaults(defaultsToRegister)

    defaults.synchronize()
}

【讨论】:

  • 这与问题有什么关系?我在那里看不到任何相似之处。
  • 您的示例没有正确编译。有关语法正确的版本,请参阅我上面的清单,该版本尚未在首次加载时显示用户应用首选项。
  • 谢谢 ZAZ,让我试试这个并回复你。原始的 Obj-C 方法以 + 开头,这意味着它是一个类方法,而不是一个带有 - 前面的实例方法。 Swift Initialize 类或实例方法是否等效?我怀疑何时执行此段对于产生正确的结果至关重要。会在几个小时内回复您。
  • 如果未来用户搜索此语法,请将其标记为正确答案
  • ZAZ,更新了您的图片,并表示正在接受同行评审。尽可能将其标记为正确。
猜你喜欢
  • 1970-01-01
  • 2012-02-27
  • 2011-07-26
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 2018-03-04
  • 2011-02-10
  • 2011-03-07
相关资源
最近更新 更多