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

Mir*_*iro 8 ios watchkit

我有一个基本的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:@[@{}]];
Run Code Online (Sandbox Code Playgroud)

基于页面的导航删除,原始导航在短微调器后加载.但是它无法正常运行,原始操作会导致此错误.

Extension[6766:123665] *********** ERROR 
-[SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID:(null) not found
Run Code Online (Sandbox Code Playgroud)

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

编辑,2/19

似乎还有一些其他操作也会导致此错误.例如,如果segue到第二个InterfaceController然后popController返回,则经常出现错误.它始终与此函数的辅助调用相关.

[WKInterfaceController reloadRootControllersWithNames: contexts:]
Run Code Online (Sandbox Code Playgroud)

EDIT2,3/18

如前所述,通过执行seguePush,popController,然后尝试reloadRootControllersWithNames,这可以100%重现.

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

这种情况似乎是这个bug的多个>单个多实例的补充.

Mir*_*iro 0

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

这是如何允许推送和分页的,通过一个例子:

  1. 推送视图控制器
  2. reloadRootControllersWithNames 返回原始控制器。(过渡不是那么动画,但已经足够了)
  3. 创建基于页面的视图控制器。
  4. reloadRootControllersWithNames 返回原始控制器
  5. 根据需要重复 1 或 3。

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

可能有一种更好的方法可以在不进行推送调用的情况下导航到子界面控制器,但我在手表上还没有意识到这一点。