iPhone 应用启动时无法从 Watch 读取 NSUserDefaults

Unable to read NSUserDefaults from Watch when iPhone app launched

我想弄清楚 iPhone 应用程序启动时手表处于什么状态。

手表上有3个按钮。按下按钮时,以下代码为 运行:

if let watchDefaults = NSUserDefaults(suiteName: "group.mywatchkit") {
        watchDefaults.setInteger(1, forKey: "intstate")
        watchDefaults.synchronize()
    }

然后当应用程序启动时,在 viewDidLoad() 方法中我尝试检索状态:

if let watchDefaults = NSUserDefaults(suiteName: "group.mywatchkit"){

        let currentState = watchDefaults.integerForKey("intstate")

        if currentState != 0 {

            stateLabel.text = currentState.description
            switch currentState {
            case 1: 
                //do what state 1 needs
                println("current state is \(currentState)")

            case 2: 
                //do what state 2 needs
                println("current state is \(currentState)")
            case 3: 
                //do what state 3 needs
                println("current state is \(currentState)")


            default:
                println("default state")

            }

        } else {

            watchDefaults.setInteger(3, forKey: "intstate")
            stateLabel.text = "current state is 3"
        }

    }

遗憾的是,我总是收到字符串“???”我错过了一些基本的东西吗?

因为它 returns 0 如果没有值,它永远不会为零。所以你只需要检查它是否等于 0.

您应该使用名为 stringForKey() 的 NSUserDefaults 方法来加载您的字符串。只需使用您用于 suitName 的相同方法(如果允许)即可安全地解开该键的字符串。像这样尝试:

if let watchDefaults = NSUserDefaults(suiteName: "group.mywatchkit") {
    watchDefaults.setObject("buttonX", forKey: "state")
}
if let watchDefaults = NSUserDefaults(suiteName: "group.mywatchkit"){
    if let currentState = watchDefaults.stringForKey("state") {
        println(currentState)  // "buttonX"
    }
     else {
        println(false)
    }
}

您在代码中使用了不同的键名:stateintstate