Adoro la codificación al iPhone SDK. Es la codificación más alegre que he hecho en el cuarto de siglo (¡jadeo!). He gastado la codificación de varios sistemas informáticos. Es una combinación de Objective-C (elegante) y Cocoa (hermoso). Hay una excepción que sigo recibiendo y con poca frecuencia que olvido por qué la obtengo. Pensé que alguien podría beneficiarse de esto porque es una trampa fácil de caer.
La excepción en cuestión:
*** Aplicación de terminación debido a la excepción no detectada 'NSInvalidArgumentException', razón: '*** - [UINavigationController pushViewController:]: selector no reconocido enviado a la instancia 0x5255c0'
Si utiliza la plantilla de la aplicación basada en la navegación al crear un nuevo proyecto, obtendrá un conjunto de archivos de proyecto que lo guiará bastante hacia una aplicación funcional. De hecho, puede pulsar compilar e ir y la aplicación compilará, ejecutará y le mostrará una bonita vista de tabla. Probablemente luego agregará código para hacer que la vista de tabla muestre cosas en las celdas, probando a lo largo del camino, y funcionará. En algún momento, es posible que desee hacer toques en las celdas para abrir una nueva vista. La plantilla proporciona un método de ejemplo "didSelectRowAtIndexPath" que se muestra aquí:
- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath {
// La lógica de navegación puede ir aquí. Crea y presiona otro controlador de vista.
// AnotherViewController * anotherViewController = [[Asignación de AnotherViewController] initWithNibName: @ "AnotherView" bundle: nil];
// [self.navigationController pushViewController: anotherViewController];
// [lanzamiento de anotherViewController];
}
El método en sí no está comentado, pero todas las instrucciones que contiene. Estas líneas comentadas proporcionan una pista sobre lo que debería suceder. La línea
[self.navigationController pushViewController: anotherViewController];
es la clave tanto para el funcionamiento de este método como para 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 elimina el comentario de esta línea y la ajusta para usar el nuevo controlador de vista que ha creado, recibirá una advertencia cuando la cree: "advertencia: 'UINavigationController' puede no responder a -pushViewController: '" Pero, bueno , esto es una advertencia, no un error. Bah. Sin embargo, ejecútelo y obtendrá el error que se muestra arriba y un selector no reconocido enviado a una instancia.
Si lo que has leído hasta ahora te suena familiar, la solución más probable es simple. La línea superior de la plantilla proporcionada por Apple es incorrecta. En realidad, no hay una firma de mensaje para UINaigationController llamada -pushViewController: pero hay una llamada -pushViewController: animated: - ¡Vaya! Lo siento Apple! Aunque todavía te amamos. Muy fácil de solucionar, pero si ocurre después de un largo día de codificación, puede causar una frustración indebida. La línea corregida debe verse algo como:
[self.navigationController pushViewController: anotherViewController animated: YES];
¡Reconstruye y este error será resuelto! Si este fuera tu problema. Si no lo fue, entonces no desesperes. Descifrar mensajes de excepción es parte de la parte divertida del estilo de vida de coderdom. Un "selector no reconocido" aún se referirá al mensaje que está enviando "a instancia", algún objeto que ha creado. La excepción incluso nos dice qué clase de objeto 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 un problema con el mensaje que se estaba enviando, pero es posible que no siempre pueda determinarlo, por lo que no puede confiar en él. Sin embargo, debe poder buscar en su código el mensaje informado en la excepción del registro de la consola. Asegúrese de que todo sea correcto en esta línea, verifique en la documentación la naturaleza exacta de la llamada.