【问题标题】:WatchKit reloadRootControllersWithNames causing error, with pageController or after push/popWatchKit reloadRootControllersWithNames 导致错误,使用 pageController 或在 push/pop 之后
【发布时间】:2015-02-19 00:07:57
【问题描述】:

我有一个基本的 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的multi->single-multi实例。

【问题讨论】:

  • 在 Xcode 6.2 离开测试版之后仍然会发生这种情况,并且被认为是稳定的。
  • 此链接stackoverflow.com/questions/28954007/… 中答案中的解决方法应该对您有所帮助。

标签: ios watchkit


【解决方案1】:

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

您不能将分层和基于页面的界面样式结合起来。在设计时,您必须选择最适合您的应用内容的样式并针对该样式进行设计。

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

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

【讨论】:

  • 我读到它并认为这意味着您不能从基于页面的控件内部推送,或者将基于页面的控件作为推送界面控件的子视图。我认为重置根控制器意味着您可以有效地切换。
  • @Miro reloadRootControllersWithNames:contexts: 的文档明确指出它用于“在基于页面的导航中重新加载根控制器”。
【解决方案2】:

这是 Xcode 6.2 Beta 5 中 WatchKit 中的一个错误。请在 Apple 的 Bug Reporting System 上复制以下 radar,以帮助提高修复此问题的优先级。

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

【讨论】:

  • 嗨@Miro,如果这个答案帮助你解决了你的问题,你能把它标记为这样吗?干杯。
  • 我只是骗了这个。它仍然在 6.2 public(版本 6.2 (6C121))中发生
【解决方案3】:

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

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

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

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

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

【讨论】:

  • 如果您只需要 1 的层次深度,那么您可以将点击项目的详细信息呈现为模态呈现的界面控制器。
  • 请注意,此行为不是错误,Apple 的文档明确指出不要在其 WatchKit 文档中混合分层导航类型,如 @topes 回答中所述,这可能导致 AppStore如果 Apple 以破坏此解决方法的方式更改底层 SDK,则提交拒绝和/或让任何尝试此方法的人背负大量技术债务。 stackoverflow.com/a/29594055/868193
【解决方案4】:

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

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

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

【讨论】:

    猜你喜欢
    • 2019-06-14
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多