Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios WatchKit:找不到接口控制器类_Ios_Storyboard_Watchkit - Fatal编程技术网

Ios WatchKit:找不到接口控制器类

Ios WatchKit:找不到接口控制器类,ios,storyboard,watchkit,Ios,Storyboard,Watchkit,我尝试将接口控制器添加到故事板,将其自定义类设置为WKInterfaceController子类,在模拟器中启动应用程序并导航到指定的接口控制器 当我这样做时,我会得到以下错误: WatchKit错误-找不到要实例化的接口控制器类“TestController” 如果我尝试与控制器交互(例如,尝试启动其按钮的操作),我会得到以下错误: ***********错误-[SPRemoteInterface\u InterfaceControllerClientId ForControllerId:]

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

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

WatchKit错误-找不到要实例化的接口控制器类“TestController”

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

  • ***********错误-[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项目,对 浏览(添加图像)并获取错误

复制步骤

  • 清除手表和iOS模拟器中的所有数据
  • 在XCode中,创建一个新的WatchKit应用程序,包括compl
    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.
    }