WatchKit:无法找到接口控制器类

Sen*_*ful 28 storyboard ios watchkit

我尝试将一个接口控制器添加到故事板,将其Custom Class设置为WKInterfaceController子类,在模拟器中启动应用程序并导航到指定的接口控制器.

当我这样做时,我收到以下错误:

WatchKit错误 - 无法找到接口控制器类'TestController'来实例化

如果我尝试与控制器交互(例如尝试启动其按钮的操作),我会收到以下错误:

  • ***********ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] interfaceControllerID的clientIdentifier :( null)未找到
  • ***********ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientControllerID的clientIdentifier:找不到7120004

我尝试按照此答案的建议设置模块名称,但这仍然给我以下错误:

  • WatchKit错误 - 无法找到接口控制器类'_TtC29myWatchApp_WatchKit_App19TestController'来实例化
  • ***********ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] interfaceControllerID的clientIdentifier :( null)未找到
  • ***********ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] interfaceControllerID的clientIdentifier:找不到6E20004

Can*_*ich 34

重命名WatchKit目标后出现此错误,但最终意识到:如果重命名WatchKit目标,则必须通过Interface Builder中的接口,并确保每个接口的模块名称也重命名.

您可以通过选择接口控制器,单击Identity Inspector(或command-option-3),删除模块名称,然后选项卡来完成此操作.它将自动填入新的目标名称.这样做对我来说!

  • 这应该是公认的答案.谢谢! (2认同)
  • 或者,勾选"从目标继承"选项.这确保了如果您再次更改名称,则不必执行相同的练习(它将自动工作). (2认同)

pha*_*ann 16

这个错误出现了,因为我没有正确处理didDeactivate消息.我的停用控制器仍然通过接收消息MMWormhole.一旦我切断了那个连接,错误就消失了.事实证明,在模拟器中,所有已停用的接口控制器都会在内存中闲置,因此您必须仔细确保它们不会再收到任何类型的消息.我不知道手表本身是否会发生这种情况,但我们当然应该这样认为.

  • 如果您正在使用MMWormhole,请确保停止在didDeactivate中侦听消息,如下所示:self.wormhole.stopListeningForMessageWithIdentifier("identifier").这摆脱了我的错误. (5认同)

top*_*pes 10

我花了太多时间处理这个问题,但终于想出了它是什么.Apple Watch基本上有两种导航模式:

分级:

[self pushControllerWithName:@"controllerName" context:nil];
Run Code Online (Sandbox Code Playgroud)

基于页面的:

[[self class] reloadRootControllersWithNames:@[@"controller1",@"controller2"] contexts:nil];
Run Code Online (Sandbox Code Playgroud)

根据苹果:

您无法组合分层和基于页面的界面样式.在设计时,您必须选择最适合您应用内容和该风格设计的样式.

所以,问题是我混合了两者,这导致了未定义的行为,如:

***********ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] interfaceControllerID的clientIdentifier :( null)未找到

希望这有助于其他开发者

编辑:

只是一个对我有用的建议作为解决方法,当使用基于页面的导航时,你仍然可以呈现模态控制器(只是说):

[self presentControllerWithName:@"controllerName" context:nil];
Run Code Online (Sandbox Code Playgroud)


Sen*_*ful 7

这个错误似乎与这个错误密切相关:无法在Interface Builder中看到自定义类.

当我最初尝试解决这个问题时,我不得不手动输入模块名称,因为自定义类和模块名称的下拉列表都是空的.

检查故事板的源代码揭示了一种解决方法.

工作的接口控制器如下所示:

<controller id="AgC-eL-Hgc" customClass="InterfaceController" 
  customModule="myWatchApp_WatchKit_App" customModuleProvider="target">
Run Code Online (Sandbox Code Playgroud)

不工作的接口控制器缺少customModule和/或customModuleProvider属性.

因此,解决方法是通过右键单击并选择" 打开方式">"源代码",将这些缺少的属性手动添加到情节提要文件中.

一个较长期的解决方案可能是修复故事板,以便自定义类出现在下拉列表中(请参阅链接问题以获取一些可能的修复).

更新:

其他可以使用的接口控制器customModule="myWatchApp_WatchKit_Extension"(注意_Extension_App差异)并且不需要该customModuleProvider属性.