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)
}
}
您在代码中使用了不同的键名:state
和 intstate
我想弄清楚 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)
}
}
您在代码中使用了不同的键名:state
和 intstate