Ios WatchKit:找不到接口控制器类
我尝试将接口控制器添加到故事板,将其自定义类设置为WKInterfaceController子类,在模拟器中启动应用程序并导航到指定的接口控制器 当我这样做时,我会得到以下错误: WatchKit错误-找不到要实例化的接口控制器类“TestController” 如果我尝试与控制器交互(例如,尝试启动其按钮的操作),我会得到以下错误:Ios WatchKit:找不到接口控制器类,ios,storyboard,watchkit,Ios,Storyboard,Watchkit,我尝试将接口控制器添加到故事板,将其自定义类设置为WKInterfaceController子类,在模拟器中启动应用程序并导航到指定的接口控制器 当我这样做时,我会得到以下错误: WatchKit错误-找不到要实例化的接口控制器类“TestController” 如果我尝试与控制器交互(例如,尝试启动其按钮的操作),我会得到以下错误: ***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]
- ***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]未找到interfaceControllerID的客户端标识:(null)
- ***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]未找到interfaceControllerID:7120004的客户端标识
- WatchKit错误-找不到要实例化的接口控制器类“\u TtC29myWatchApp\u WatchKit\u App19TestController”
- ***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]未找到interfaceControllerID的客户端标识:(null)
- ***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]未找到interfaceControllerID的客户端标识:6E20004
此错误似乎与此错误密切相关: 当我最初尝试解决这个问题时,我必须手动输入模块名,因为自定义类和模块名的下拉列表都为空 检查故事板的源代码可以发现一个解决方法 工作的接口控制器如下所示:
<controller id="AgC-eL-Hgc" customClass="InterfaceController"
customModule="myWatchApp_WatchKit_App" customModuleProvider="target">
无法工作的接口控制器缺少customModule
和/或customModuleProvider
属性
因此,一种解决方法是通过右键单击脚本文件并选择openas>Source Code,手动将这些缺少的属性添加到脚本文件中
一个长期的解决方案可能是修复故事板,以便自定义类出现在下拉列表中(有关一些可能的修复,请参阅)
更新:
其他界面控制器也可以使用
customModule=“myWatchApp\u WatchKit\u Extension”
(注意\u Extension
与\u App
的区别)并且不需要customModuleProvider
属性。我想你忘了在你的类中使用故事板ID。这就是我从你的错误中得到的
这不是你做错了什么。这已经是一个众所周知的问题。看看我的答案。请在Apple上复制以下内容,以帮助提高修复此问题的优先级。在最近的8.2版本发布后,我也遇到了同样的问题。我必须找到我的每个InterfaceController,并将其自定义类模块调整为显示为选项或“无”的任何值 我出现这个错误是因为我没有正确处理
diddactivate
消息。我停用的控制器仍在通过MMWormhole
接收消息。一旦我切断了连接,错误就消失了。事实证明,在模拟器中,所有停用的接口控制器都挂在内存中,因此您必须小心确保它们不会再收到任何类型的消息。我不知道这是否发生在手表本身上,但我们当然应该假设是这样。我在重命名WatchKit目标时遇到了这个问题。当我重新命名它时,错误消失了。我在重命名WatchKit目标后出现了此错误,但最终意识到:如果重命名WatchKit目标,则必须在Interface Builder中检查接口,并确保每个目标的模块名也已重命名
您可以通过选择一个接口控制器,单击Identity Inspector(或command-option-3),删除模块名称,然后单击tab键来完成此操作。它将自动填入新的目标名称。那是为了我 我在这个问题上花了太多时间,但最终还是弄明白了它是什么。 Apple Watch基本上有两种导航模式: 层次结构:
[self pushControllerWithName:@"controllerName" context:nil];
基于页面的:
[[self class] reloadRootControllersWithNames:@[@"controller1",@"controller2"] contexts:nil];
苹果表示:
不能将层次和基于页面的界面样式组合在一起。在设计时,您必须选择最适合应用程序内容的样式,并针对该样式进行设计
所以,问题是我混合了两者,导致了未定义的行为,如:
***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]未找到interfaceControllerID的客户端标识:(null)
希望这能帮助其他开发者
编辑:
这只是一个对我有用的建议,当使用基于页面的导航时,您仍然可以显示模态控制器(只是说):
执行push/pop控制器的更好方法是将这段代码运行到主线程中,以便:
dispatch_async(dispatch_get_main_queue(), ^{
[self pushControllerWithName:@"controllerIdentifier" context:data];
});
dispatch_async(dispatch_get_main_queue(), ^{
[self popToRootController];
});
dispatch_async(dispatch_get_main_queue(), ^{
[self popController];
});
苹果的文档介绍了三种方法:
始终从WatchKit扩展的主线程调用此方法
对我来说,这似乎是一个假阴性。我尝试了所有建议的解决方案,但后来通过创建一个全新的Apple Kit项目,对一瞥进行一次更改(添加一个图像)并获得错误,证明这是Apple的错误。我在他们的Bug Reporter中记录了苹果的以下错误 头衔 在以下情况下未找到interfaceControllerID的Receive clientIdentifier 浏览浏览 描述 我收到以下错误,似乎是假阴性 在watchOS 2.0项目中浏览时。我复制了 通过创建一个全新的Apple Kit项目,对 浏览(添加图像)并获取错误 复制步骤
dispatch_async(dispatch_get_main_queue(), ^{
[self pushControllerWithName:@"controllerIdentifier" context:data];
});
dispatch_async(dispatch_get_main_queue(), ^{
[self popToRootController];
});
dispatch_async(dispatch_get_main_queue(), ^{
[self popController];
});
override func awakeWithContext(context: AnyObject?) {
super.awakeWithContext(context)
if let vcID = self.valueForKey("_viewControllerID") as? NSString {
print("Controller: \(vcID)")
}
// Configure interface objects here.
}