WatchKit reloadRootControllersWithNames 导致错误,使用 pageController 或在 push/pop 之后

WatchKit reloadRootControllersWithNames causing error, with pageController or after push/pop

我有一个基本的 watchkit 应用程序,可以加载 3 个界面控制器的基于页面的导航。这很好用,但我想触发一个操作来删除页面控件,并基本上恢复到应用程序首次加载时存在的原始 InterfaceController。

// load page based control, with 3 views.  this works ok
[WKInterfaceController reloadRootControllersWithNames:@[@"pageController1",@"pageController2",@"pageController3"] 
                       contexts:@[@"data1",@"data2",@"data3"]];

// attempt to reload original interface controller, identified by storyboard id
[WKInterfaceController reloadRootControllersWithNames:@[@"myInterfaceController"] contexts:@[@{}]];

移除了基于页面的导航,原来的导航会在短暂的旋转后加载。但是它无法正常运行,原始操作会导致此错误。

Extension[6766:123665] *********** ERROR 
-[SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID:(null) not found

有没有更好的方法来干净地重新加载原始的 InterfaceController?

编辑,2/19

似乎还有其他一些操作也导致了此错误。例如,如果转到第二个 InterfaceController 然后 popController 返回,则经常会出现错误。它总是与对该函数的二次调用有关。

[WKInterfaceController reloadRootControllersWithNames: contexts:]

EDIT2,3/18

如前所述,通过执行 seguePush、popController,然后尝试重新加载 RootControllersWithNames,这在 100% 的时间内是可重现的。

如果 seguePush/popController 没有事先完成,那么 reloadRootControllersWithNames 将正常工作。

这种情况好像是除了多->单-多实例这个bug。

这是 Xcode 6.2 Beta 5 中 WatchKit 中的一个错误。请复制以下内容 radar on Apple's Bug Reporting System 以帮助提高解决此问题的优先级。

与此同时,可以在 dev forums 上找到我找到的解决方法。您可以做的是向任何单个界面控制器页面集添加一个虚拟界面控制器,这样您就始终拥有两个。这将修复错误,直到 Apple 修复了错误(希望在 Beta 6 中)。请上当!

这实际上不是错误,因为根据 Apple 的说法:

You cannot combine hierarchical and page-based interface styles. At design time, you must choose the style that best suits your app’s content and design for that style.

很遗憾,我们不能在同一个 Watch 应用中混合使用分层和基于页面的导航模式。

这只是我们在为  Watch 开发应用程序时必须处理的众多限制之一

我能够通过不在推送视图控制器上使用 popController 来解决我的这个问题实例。相反,我使用 reloadRootControllersWithNames 代替 popController。

通过示例,这如何允许推送和分页:

  1. 推送视图控制器
  2. reloadRootControllersWithNames 到 return 到原来的控制器。 (过渡不是很动画,但足够了)
  3. 创建基于页面的视图控制器。
  4. reloadRootControllersWithNames 到return到原来的控制器
  5. 根据需要重复 1 或 3。

这消除了以非动画 popController 为代价的错误,并允许部分推送和分页。不过,它不允许更复杂的推送导航。

可能有更好的方法可以在没有推送调用的情况下导航到子界面控制器,但我在手表上还不知道。

None 或以上答案对我有用。当我更改应用程序的图标名称和手表应用程序名称时,这个问题就开始了。我是这样解决的:

  • 1) 点击你的 Watch app Target > Capabilities > 确认 app Group 处于开启状态。
  • 2) 确保应用组已 selected。
  • 3) 点击带圆圈的箭头刷新图标(这显然只是 如果你已经拥有它,请刷新它)
  • 4-重复步骤 1-3,但也要针对您的 Watch App EXTENSION 目标。
  • 5-点击Scheme按钮(STOP按钮右侧), 并点击编辑方案。
  • 6-单击 运行 > 信息 7-在可执行文件中 select 您的目标(实际上是 应该已经 selecting 但打开这个 window 似乎 刷新选项,清除错误)

显然,当您更改图标名称(目标名称)时,上述所有内容都不会自动更新,您必须转到这些菜单并打开它们才能手动刷新它们。也许对苹果感到羞耻?