Watch OS 1.0.1改变了基于页面的应用程序的生命周期:现在willActivate
/didActivate
被调用以预加载下一页。
我之前调用updateUserActivity:userInfo:webpageURL:
了我的每个页面的willActivate
方法,userInfo
为每个页面提供不同的方法。但是现在,userInfo
下一页对willActivate
.
知道如何解决这个问题吗?
Watch OS 1.0.1改变了基于页面的应用程序的生命周期:现在willActivate
/didActivate
被调用以预加载下一页。
我之前调用updateUserActivity:userInfo:webpageURL:
了我的每个页面的willActivate
方法,userInfo
为每个页面提供不同的方法。但是现在,userInfo
下一页对willActivate
.
知道如何解决这个问题吗?
我最终在未来安排了一个 1 秒的willActivate
计时器,然后在didActivate
. 当计时器触发时,它会调用updateUserActivity:userInfo:webpageURL:
. 我对任意的 1 秒间隔不太满意……我先尝试了 0.5 秒,但这太短了(我猜 WatchKit 真的那么慢吗?)。
我想我有一个更好的解决方案。它包括在每个页面控制器中维护一个 Bool 来告知控制器是否处于活动状态(显示),并保留需要更新到操作系统的 NSUserActivity 的值
private var isActive:Bool = false {
didSet(oldValue) {
if oldValue != isActive {
resolveHandoff()
}
}
}
private var currentUserActivity: NSUserActivity? {
didSet(oldUserActivity) {
if oldUserActivity == nil && currentUserActivity != nil
|| oldUserActivity != nil && currentUserActivity == nil
|| oldUserActivity != currentUserActivity {
resolveHandoff()
}
}
}
override func willActivate() {
super.willActivate()
self.isActive = true
}
override func didDeactivate() {
super.didDeactivate()
self.isActive = false
}
private func resolveHandoff() {
if !self.isActive {
return
}
if let activity = currentUserActivity {
self.updateUserActivity(activity.activityType, userInfo: activity.userInfo, webpageURL: nil)
} else {
self.invalidateUserActivity()
}
}
现在,您可以通过简单地为 currentUserActivity 分配一个值,在界面控制器代码中的任何位置“标记”您的用户活动。例如它可以在 awakeWithContext: 方法中
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
let ua = NSUserActivity(activityType: "com.mycompany.doingSomething")
ua.userInfo = ["My key": "My value"]
self.currentUserActivity = ua
}
仅当设置了 currentUserActivity 并且控制器处于活动状态(显示)时才会报告用户活动。请注意,上面的实现方式允许您在控制器处于活动状态时通过简单地设置 self.currentUserActivity = nil 来使用户活动无效。