ios storyboard watchkit

ios - WatchKit: no se puede encontrar la clase de controlador de interfaz



storyboard (14)

Creo que olvidaste usar el ID de guión gráfico para tu clase. Eso es lo que obtengo de tu error.

Intenté agregar un controlador de interfaz a un guión gráfico, establecer su Clase personalizada en una subclase WKInterfaceController, lanzar la aplicación en el simulador y navegar al controlador de interfaz especificado.

Cuando lo hago, me sale el siguiente error:

Error de WatchKit: no se puede encontrar la clase de controlador de interfaz ''TestController'' para crear una instancia

Si trato de interactuar con el controlador (por ejemplo, intente iniciar la acción de su botón), obtengo el siguiente error:

  • *********** ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier para interfaceControllerID: (nulo) no encontrado
  • *********** ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID: 7120004 no encontrado

Intenté establecer el nombre del módulo como se recomienda en esta respuesta , pero eso todavía me da los siguientes errores:

  • Error de WatchKit: no se puede encontrar la clase de controlador de interfaz ''_TtC29myWatchApp_WatchKit_App19TestController'' para crear una instancia
  • *********** ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier para interfaceControllerID: (nulo) no encontrado
  • *********** ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier for interfaceControllerID: 6E20004 no encontrado

Debe verificar que el controlador de vista está en su fuente de compilación aquí: Seleccione Proyecto> Seleccionar destino de extensión de Watchkit> Fases de compilación> Fuentes de compilación


El nombre del módulo del controlador debe ser el mismo que el nombre de la raíz de su proyecto (nombre del icono del documento Xcode azul superior izquierdo).

El nombre del módulo de su interfaz dinámica debe ser el mismo nombre y el nombre del módulo del controlador de destino (es decir, el nombre al que está presionando) también debe ser el mismo nombre.

Por cierto, en caso de que sea nuevo o no esté seguro, pensé que lo haría porque podría estar pensando que su clase está equivocada o algo así. Su controlador dinámico de interfaz no tiene que apuntar a la clase predeterminada de Xcode NotificationController.swift. Por supuesto, puede crear una clase personalizada, por ejemplo, FriendRequestNotificationController

Para solucionar problemas, puede agregar este código al método awakeWithContext para ver qué controladores tienen qué ID.

override func awakeWithContext(context: AnyObject?) { super.awakeWithContext(context) if let vcID = self.valueForKey("_viewControllerID") as? NSString { print("Controller: /(vcID)") } // Configure interface objects here. }


Estaba teniendo los mismos problemas después de la reciente versión 8.2. Tuve que ir a cada uno de mis controladores de interfaz y ajustar su módulo de clase personalizado a lo que se muestra como una opción o "ninguno".


Este error parece estar estrechamente relacionado con este: No se pueden ver las clases personalizadas en el desplegable de Interface Builder .

Cuando intenté resolver esto originalmente, tuve que escribir manualmente el nombre del módulo ya que el menú desplegable estaba vacío tanto para las clases personalizadas como para los nombres de los módulos.

El examen del código fuente del guión gráfico revela una solución alternativa.

Los controladores de interfaz que funcionan se ven así:

<controller id="AgC-eL-Hgc" customClass="InterfaceController" customModule="myWatchApp_WatchKit_App" customModuleProvider="target">

Los controladores de interfaz que no funcionan carecen de los customModule y / o customModuleProvider .

Por lo tanto, una solución es agregar manualmente los atributos que faltan al archivo del guión gráfico haciendo clic derecho en él y seleccionando Abrir como> Código fuente .

Una solución a más largo plazo puede ser arreglar el guión gráfico para que aparezcan clases personalizadas en los menús desplegables (consulte la pregunta vinculada para conocer algunas posibles soluciones).

Actualizar:

Otros controladores de interfaz que también funcionan utilizan customModule="myWatchApp_WatchKit_Extension" (note la diferencia _Extension vs. _App ) y no necesitan el atributo customModuleProvider .


La mejor manera de hacer un controlador push / pop es ejecutar ese fragmento de código en el hilo principal, de modo que:

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]; });

La documentación de Apple dice acerca de los tres métodos:

Siempre llame a este método desde el hilo principal de su extensión WatchKit.


No es nada que estés haciendo mal. Esto ya es un problema conocido. Vea mi respuesta here . Duplique el siguiente radar en el sistema de informe de errores de Apple para ayudar a aumentar la prioridad para solucionarlo.


Para mí, esto parece ser un falso negativo. Probé todas las soluciones sugeridas, pero luego probé que es un error de Apple al crear un nuevo proyecto de Apple Kit, hacer un cambio en el vistazo (agregar una imagen) y obtener el error. He registrado el siguiente error con Apple en su Bug Reporter.

Título

No se encontró clientIdentifier para interfaceControllerID al navegar a Glance

Descripción

Recibo el siguiente error que parece ser un falso negativo cuando navego a un vistazo en un proyecto watchOS 2.0. Lo reproduje creando un nuevo proyecto de Apple Kit, realizando un cambio en el Glance (agregando una imagen) y obteniendo el error.

pasos para reproducir

  1. Borrar todos los datos en los simuladores de reloj y iOS.
  2. En XCode, crea una nueva aplicación WatchKit que incluye complicación y mirada.
  3. Ejecutar y ver sin problemas.
  4. Agregue un png a sus activos de imagen.
  5. Agregue un UIImageView al Glance en Interface Builder.
  6. Ejecutar la extensión en el simulador de reloj.
  7. Habilita el vistazo en la aplicación complementaria de iOS Watch.
  8. Navega a la Glance en el simulador de relojes.
  9. Tenga en cuenta el error de seguimiento en su registro.

2015-07-16 08: 35: 10.663 restaurant-reports WatchKit App Extension [78301: 2211560] *********** ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier para interfaceControllerID: 3118001E no encontrado

Resultado Esperado

No deben aparecer falsos negativos en el registro

Resultado actual

Aparece un falso negativo en el registro.

Ver la versión del sistema operativo (compilación)

2.0 (13S5293f)

Me dieron identificación de error 21853566.


Pasé demasiado tiempo con este problema, pero finalmente me di cuenta de lo que era. El Apple Watch tiene básicamente dos patrones de navegación:

Jerárquico:

[self pushControllerWithName:@"controllerName" context:nil];

Basado en la página:

[[self class] reloadRootControllersWithNames:@[@"controller1",@"controller2"] contexts:nil];

Según la manzana:

No puede combinar estilos de interfaz jerárquicos y basados ​​en páginas. En el momento del diseño, debe elegir el estilo que mejor se adapte al contenido y diseño de su aplicación para ese estilo.

Entonces, el problema es que estaba mezclando ambos y eso lleva a un comportamiento indefinido como:

*********** ERROR - [SPRemoteInterface _interfaceControllerClientIDForControllerID:] clientIdentifier para interfaceControllerID: (nulo) no encontrado

Espero que esto ayude a otros desarrolladores.

EDITAR:

Solo una sugerencia que funcionó para mí como solución alternativa, al utilizar la navegación basada en páginas, aún puede presentar controladores modales (solo con decir):

[self presentControllerWithName:@"controllerName" context:nil];


Recibí este error después de cambiar el nombre del objetivo WatchKit, pero finalmente me di cuenta: si cambia el nombre de sus objetivos WatchKit, tendrá que pasar por las interfaces en Interface Builder y asegurarse de que los nombres de los módulos para cada uno de ellos también cambien de nombre.

Puede hacer esto seleccionando un controlador de interfaz, haciendo clic en el Inspector de identidad (o comando-opción-3), eliminar el nombre del módulo y luego separar la pestaña. Se completará automáticamente con el nuevo nombre de destino. Eso lo hizo por mí!


Tuve este problema cuando configuré erróneamente el identificador del controlador de interfaz raíz. Cuando quito el identificador, esta advertencia desapareció.


Tuve este problema cuando renombré el objetivo de WatchKit. Cuando lo renombré, el error desapareció.


Este error se me ocurrió porque no estaba manejando correctamente el mensaje didDeactivate . Mi controlador desactivado seguía recibiendo mensajes a través de MMWormhole . Una vez que corté esa conexión, el error desapareció. Resulta que en el simulador todos los controladores de interfaz desactivados permanecen en la memoria, así que debes asegurarte de que no reciban más mensajes de ningún tipo. No sé si esto sucede en el propio Watch, pero, por supuesto, deberíamos asumirlo.


  • Si está utilizando la navegación basada en páginas (desde donde está manejando push o presentando un nuevo controlador de vista), presente el nuevo controlador en lugar de presionarlo .
  • Desde la primera pantalla que se basa en páginas (como en el controlador de vista de página), entonces, de forma predeterminada, utiliza el empuje de la página siguiente o la página anterior al deslizar el dedo hacia la izquierda y hacia la derecha y se convierte en la vista de la ventana raíz de su aplicación WatchKit. En este caso, si presiona otro controlador al hacer clic dentro de los controles internos, no reconocerá el empuje sino que reconocerá el nuevo controlador actual . Por lo tanto, por favor siga las reglas si es posible.