0

Watch OS 1.0.1改变了基于页面的应用程序的生命周期:现在willActivate/didActivate被调用以预加载下一页。

我之前调用updateUserActivity:userInfo:webpageURL:了我的每个页面的willActivate方法,userInfo为每个页面提供不同的方法。但是现在,userInfo下一页对willActivate.

知道如何解决这个问题吗?

4

2 回答 2

0

我最终在未来安排了一个 1 秒的willActivate计时器,然后在didActivate. 当计时器触发时,它会调用updateUserActivity:userInfo:webpageURL:. 我对任意的 1 秒间隔不太满意……我先尝试了 0.5 秒,但这太短了(我猜 WatchKit 真的那么慢吗?)。

于 2015-05-28T03:38:32.127 回答
0

我想我有一个更好的解决方案。它包括在每个页面控制器中维护一个 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 来使用户活动无效。

于 2015-06-11T13:40:07.457 回答