如何在Watch OS 1.0.1上的WatchKit应用程序中实现每页切换?

时间:2015-05-28 03:38:32

标签: ios watchkit handoff

观看操作系统1.0.1 changed the lifecycle for page-based apps:现在调用willActivate / didActivate以便下一页预加载它。

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

知道怎么解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

我最后在willActivate中将计时器安排了1秒,然后在didActivate中使计时器无效。当计时器触发时,它会调用updateUserActivity:userInfo:webpageURL:。我对任意1秒间隔不太满意......我先尝试0.5秒,但那太短了(我觉得WatchKit真的很慢?)。

答案 1 :(得分:0)

我认为我有更好的解决方案。 它包括在每个页面控制器中维护一个Bool,告诉控制器是否处于活动状态(显示),并保持需要更新到OS的NSUserActivity的值

<ui:repeat var="x" value="#{testController.createAndReturnHashmap()}">
    #{x.qualifiedProduct.abstractProductId},#{x.qualifiedProduct.abstractProductCode}

    <ui:repeat var="dt" value="#{x.dates}">
            #{dt}
    </ui:repeat>

</ui:repeat>

现在,您可以通过简单地为currentUserActivity分配值,在接口控制器代码中随时“标记”您的用户活动。例如,它可以在awakeWithContext:方法

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且控制器处于活动状态(显示)时,才会报告用户活动。 请注意,上面的实现方式允许您通过在控制器处于活动状态时设置self.currentUserActivity = nil来使invalidAserActivity无效。