Iphone sdk: resolver [uinavigationcontroller pushviewcontroller:] selector no reconocido enviado a la instancia

Adoro la codificación para el iPhone SDK. Es la codificación más alegre que he hecho en el cuarto de siglo (¡oh!) Me he pasado la codificación de diversos sistemas informáticos. Es una combinación de Objective-C (elegante) y cacao (hermosa). Hay una excepción y me siguen dando simplemente con tan poca frecuencia que olvido por eso lo entiendo. Pensé que alguien podría beneficiarse de esto porque es una trampa fácil caer en.

La excepción de que se trate:

Vídeo: Tutorial 11 iPhone SDK: PushViewController

*** Terminación de aplicación debido a excepción no detectada `NSInvalidArgumentException`, razón: `*** - [UINavigationController pushViewController:]: Selector no reconocido enviado a la instancia 0x5255c0`

Si utiliza la plantilla de aplicación de navegación basada en la hora de crear un nuevo proyecto, que obtendrá un conjunto de archivos de proyecto que le consigue una buena parte del camino hacia una aplicación funcional. De hecho, usted puede golpear la acumulación e ir a la aplicación va a compilar, ejecutar y mostrar una visión bastante tabla. Es probable que a continuación, agregar código para hacer las cosas de pantalla vista de tabla en las células, poniendo a prueba a lo largo del camino, y que va a trabajar. En algún momento, es posible que desee hacer toques en las células abren una nueva vista. La plantilla proporciona un ejemplo de método “didSelectRowAtIndexPath” que se muestra aquí:

Vídeo: Push to another view Controller using segue in iOS

- (Void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
// la lógica de navegación puede ir aquí. Crear y empujar otro controlador de vista.
// AnotherViewController * anotherViewController = [[AnotherViewController alloc] initWithNibName: @"Otra vista" paquete: nil] -
// [self.navigationController pushViewController: anotherViewController] -
// [liberación anotherViewController] -
}

El método en sí no está comentado, pero todas las instrucciones dentro de ella son. Estas líneas comentadas proporcionan una idea de lo que debería suceder. La línea

[Self.navigationController pushViewController: anotherViewController] -

es la clave tanto para el funcionamiento de este método y la causa del error. Empuja un nuevo controlador de vista en la pila de navegación y lo muestra, exactamente lo que quiere que haga. Sin embargo, si se elimina el comentario de esta línea y ajustarlo a utilizar el nuevo controlador de vista que ha creado, obtendrá una advertencia cuando usted lo construye: "aviso: `UINavigationController` puede no responder a -pushViewController:" Pero, bueno , esto es una advertencia, no un error. Bah. Ejecutarlo, sin embargo, y obtendrá el error se muestra arriba, y el selector no reconocido enviado a una instancia.

Si lo que ha leído hasta ahora suena familiar, la solución probable es simple. La línea anterior de la plantilla proporcionada por Apple está mal. Hay en realidad no es una firma de mensaje para UINaigationController llamados -pushViewController: pero hay una llamada -pushViewController: Animación: - ¡Huy! Lo sentimos Manzana! Todavía le amamos, sin embargo. Muy fácil de solucionar, pero si ocurre después de un largo día de codificación, puede causar frustración indebida. La línea corregida debería ser algo como:

[Self.navigationController pushViewController: anotherViewController animado: SÍ] -

Reconstruir y será resuelto este error! Si este era su problema. Si no fue así, entonces no se desespere. Descifrado de mensajes de excepción es parte de la diversión parte del estilo de vida de coderdom. Un “selector no reconocido” todavía va a referirse al mensaje que está enviando “a instancia”, un objeto que ha creado. La excepción incluso nos indica qué clase del objeto que está recibiendo el mensaje extraño (UINavigationController en este caso) y el mensaje que se envió (pushViewController :). En este caso, el compilador sabía que había algo repulsivo sobre el mensaje que se envía, pero no siempre puede ser capaz de determinar esto, por lo que no se puede confiar en ella. Sin embargo, usted debe ser capaz de buscar su código para el mensaje reportado en la excepción del registro de la consola. Asegúrese de que todo es correcto en esta línea comprobar en la documentación de la naturaleza exacta de la llamada.

Artículos Relacionados