检测WatchKit应用程序中的活动接口控制器



我构建了一个具有分层结构的WatchKit应用程序,可以接收可操作的推送通知。当收到通知时,操作是推送一个特定的界面控制器,这样用户就可以立即查看它,而不必浏览菜单。

苹果公司关于handleActionWithIdentifier:ForRemoteNotification:的文档指出,这个方法只在初始接口控制器上调用,所以我在初始接口控制中处理远程通知的代码如下:

override func handleActionWithIdentifier(identifier: String?, forRemoteNotification remoteNotification: [NSObject : AnyObject]) {
if let notificationIdentifier = identifier {
if notificationIdentifier == "myActionIdentifier" {
pushControllerWithName("myActionController", context: nil)
}
}
}

然而,问题是,如果用户之前已经在查看此myActionController,然后挂起了我的应用程序,然后收到此通知并采取了操作,则应用程序将再次将同一myActionController推送到堆栈上。然后,当用户点击"返回"按钮时,他们会弹出到上一个myActionController上,看起来是一样的。这个问题也会叠加——如果用户收到多个此类通知并对所有通知采取操作,myActionController就会开始叠加。

我想通过在handleActionWithIdentifier:forRemoteNotification:中检查当前活动的接口控制器是什么来解决这个问题,如果它已经是myActionController,请不要做任何事情(因为一旦对它调用willActivate:,它就会重新加载)。我知道这在iOS中是可能的(有时),例如在UINavigationController上,但我不知道在WatchKit中是否可能。有人有什么想法吗?

我在自己的WatchKit应用程序中有几乎完全相同的场景,我通过跟踪当前呈现的视图控制器来处理它。在一个简单的版本中,您可以跟踪您展示的最后一个视图控制器的名称,并在展示控制器的willActivate方法中清除它(当展示控制器重新显示时会调用它)。如果您在演示内容时收到通知,则可以决定是否需要先关闭/弹出控制器。

它可能比您想要/需要的更多,但我已经编写了一个JBInterfaceController子类,它包含了许多这样的功能:https://github.com/mikeswanson/JBInterfaceController

最新更新