Creé un botón y agregué una acción para él, pero tan pronto como se invocó, recibí este error:
-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance
0x3d03ac0 2010-03-16 22:23:58.811
Money[8056:207] *** Terminating app
due to uncaught exception
'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0'
Este es mi código:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom];
numberButton.frame = CGRectMake(10, 435, 46, 38);
[numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal];
[numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview: numberButton];
}
return self;
}
-(IBAction)numberButtonClick:(id)sender{
NSLog(@"---");
}
objective-c
selector
unrecognized-selector
Hola Mundo
fuente
fuente
Respuestas:
Parece que no está manejando la memoria del controlador de vista correctamente y se está desasignando en algún momento, lo que hace que el
numberButtonClicked:
método se envíe a otro objeto que ahora está ocupando la memoria que el controlador de vista estaba ocupando anteriormente ...Asegúrese de retener / liberar correctamente su controlador de vista.
fuente
-[NSWindow end]: unrecognized selector sent to instance 0x100523e80
y aunque me doy cuenta de las similitudes con el OP, e incluso posiblemente la causa del problema de su respuesta, la implementación de una solución no es inmediatamente obviaPara aquellos que llegan aquí a través de Google como lo hice yo, lo que probablemente pertenece más a Xcode 4.2 + / iOS 5+ más, con ARC. Tuve el mismo error " selector no reconocido enviado a la instancia ". En mi caso, tenía una acción objetivo de UIButton configurada para pasarse a sí misma como parámetro del remitente, pero luego me di cuenta de que no la necesitaba y la eliminé en el código. Entonces, algo como:
Se cambió a:
Al hacer clic con el botón derecho en el botón UIB en cuestión, se mostró que el evento Touch Up Inside estaba asociado con el botón de los controladores de vista Presionado: método. Eliminar esto y reasignarlo al método modificado funcionó de maravilla.
fuente
Esta fue la principal respuesta de Google para este problema, pero tenía una causa / resultado diferente: pensé en agregar mis dos centavos en caso de que otros se toparan con este problema.
Tuve un problema similar esta mañana. Descubrí que si hace clic derecho en el elemento de la interfaz de usuario que le da el problema, puede ver qué conexiones se han creado. En mi caso, tenía un botón conectado a dos acciones. Eliminé las acciones del menú contextual y las volví a conectar y mi problema se solucionó.
Así que asegúrese de que sus acciones estén cableadas correctamente.
fuente
OK, tengo que meterme aquí. El OP creó dinámicamente el botón . Tuve un problema similar y la respuesta (después de horas de caza) es tan simple que me enfermó.
Cuando usas:
Si coloca dos puntos al final de la cadena, pasará al remitente. Si no coloca los dos puntos al final de la cadena, no lo hará, y el receptor recibirá un error si espera uno. Es fácil perder los dos puntos si está creando dinámicamente el nombre del evento.
Las opciones de código del receptor se ven así:
Como de costumbre, siempre se pierde la respuesta obvia.
fuente
En mi caso, la función no esperaba un argumento, pero el botón se configuró para enviar uno que causara el error. Para solucionar esto, tuve que volver a cablear el controlador de eventos.
Aquí está mi función:
Observe que no contiene argumentos.
Aquí hay una imagen de la configuración de mi botón (haga clic derecho en el botón para verlo):
Tenga en cuenta que hay 3 controladores de eventos.
Para solucionar esto, tuve que eliminar cada uno de los elementos del evento ya que uno de ellos estaba enviando una referencia a sí mismo a la función enterPressed. Para eliminar estos elementos, hice clic en el pequeño icono x al lado del nombre de cada elemento hasta que no se mostraron.
Luego tuve que volver a conectar el botón al evento. Para hacer esto, mantenga presionada la tecla Control y luego arrastre una línea desde el botón a la acción. Debería decir "Acción de conexión". Nota: Tuve que reiniciar XCode para que esto funcione por alguna razón; de lo contrario, solo me permite insertar acciones (también conocido como crear una nueva acción) encima o debajo de la función.
Ahora debería tener un único controlador de eventos conectado al evento de botón que no pasa argumentos:
Esta respuesta complementa la respuesta de @Leonard Challis, que también deberías leer.
fuente
Esto también puede suceder si no configura la "Clase" de la vista en el generador de interfaces.
fuente
En mi caso, estaba usando NSNotificationCenter e intentaba usar un selector que no tomaba argumentos, pero agregaba dos puntos. Eliminar el colon solucionó el problema.
Cuando use un nombre de selector, no use dos puntos finales si no hay argumentos. Si hay un argumento, use dos puntos finales. Si hay más de un argumento, debe nombrarlos junto con dos puntos finales para cada argumento.
Vea la respuesta de Adam Rosenfield aquí: ¿ Selectores en Objective-C?
fuente
Tuve este problema con un proyecto Swift donde estoy creando los botones dinámicamente. Código de problema
La solución fue agregar dos puntos ':' después de la acción: ej.
Ejemplo completo aquí: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html
fuente
La causa más obvia de esto (incluido para completar) es lanzar incorrectamente un puntero y llamar a un método de la clase incorrecta.
fuente
También tuve el mismo problema.
Eliminé mi uibutton en mi guión gráfico y lo recreé ... ahora todo funciona bien.
fuente
Tuve un problema similar, pero para mí la solución fue ligeramente diferente. En mi caso, utilicé una categoría para extender una clase existente (UIImage para algunas capacidades de cambio de tamaño; vea este tutorial en caso de que esté interesado) y olvidé agregar el archivo * .m al destino de compilación. Error estúpido, pero no siempre es obvio cuando sucede dónde buscar. Pensé que valía la pena compartir ...
fuente
Esto me sucedió porque borré accidentalmente la "función @IBAction ..." dentro de mi código de clase UIViewcontroller, por lo que en el Storyboard se creó el Outlet de referencia, pero en el tiempo de ejecución había alguna función para procesarlo.
La solución fue eliminar la referencia de Outlet dentro del inspector de propiedades y luego volver a crearla arrastrando con la tecla de comando al código de clase.
¡Espero eso ayude!
fuente
Creo que debería usar el vacío, en lugar del IBAction en el tipo de retorno. porque definiste un botón mediante programación.
fuente
Otra posible solución: agregue '-ObjC' a sus argumentos de enlazador.
La explicación completa está aquí: categorías de Objective-C en la biblioteca estática
Creo que la esencia es: si la categoría se define en una biblioteca con la que está vinculando estáticamente, el vinculador no es lo suficientemente inteligente como para vincular en los métodos de categoría. El indicador de arriba hace que el enlazador se vincule en todas las clases y categorías objetivas de C, no solo en las que cree que deben basarse en el análisis de su fuente. (Por favor, siéntase libre de sintonizar o corregir esa respuesta. Conozco los idiomas vinculados, así que solo estoy parroteando aquí).
fuente
Tuve el mismo error y descubrí lo siguiente:
Cuando usas el código
Puede pensar que está buscando el selector:
Pero en realidad está buscando el selector:
Ese selector no existe, por lo que obtienes el bloqueo.
Puede cambiar el selector para recibir el remitente (id) para resolver el error.
Pero, ¿qué sucede si tiene otras funciones que llaman a la función de actualización sin proporcionar un remitente? Necesita una función que funcione para ambos. La solución fácil es agregar otra función:
Y luego modifique el código desplegable de actualización para llamar a ese selector en su lugar:
También estoy haciendo el curso de Stanford iOS en una Mac anterior que no se puede actualizar a la versión más reciente de Mac OSX. Así que todavía estoy compilando para iOS 6.1, y esto resolvió el problema para mí.
fuente
En mi caso, resolví el problema después de 2 horas:
El remitente (un elemento tabBar) no tenía ninguna salida de referencia . Así que no apuntaba a ninguna parte.
Simplemente cree una salida de referencia correspondiente a su función.
Espero que esto pueda ayudarlos.
fuente
IBAction
a Swift. Por lo tanto, se quejaba de que quería llamar a esa función, pero no se pudo encontrar.Actualmente estoy aprendiendo el desarrollo de iOS y revisando el libro "Beginning iOS6 Development" de aPress. Recibí el mismo error en el Capítulo 10: Storyboards.
Me tomó dos días descubrirlo, pero descubrí que accidentalmente configuré la etiqueta de la celda TableView en 1 cuando no debería haberlo hecho. Para cualquier otra persona que esté haciendo este libro y reciba un error similar, espero que esto ayude.
¡Realmente espero que los errores futuros en mi código sean más fáciles de encontrar! jajaja. El error de depuración no hizo nada para empujarme en la dirección correcta para resolverlo (o al menos soy demasiado nuevo para entender al depurador, jajaja).
fuente
En mi caso, estaba usando un UIWebView y pasé un NSString en el segundo parámetro en lugar de un NSURL. Entonces sospecho que los tipos de clase incorrectos pasados a una función pueden causar este error.
fuente
.. Y ahora el mío
Tenía el botón vinculado a un método que accedía al parámetro de otro botón y funcionó muy bien PERO tan pronto como intenté hacer algo con el botón en sí, tuve un bloqueo. Durante la compilación, no se ha mostrado ningún error. ¿Solución?
No pude vincular el botón al propietario del archivo. Entonces, si alguien aquí es tan estúpido como yo, prueba esto :)
fuente
Otra solución / caso ligeramente diferente.
Estoy usando Xamarin y MvvmCross e intentaba vincular el UIButton a un ViewModel. Tenía el UIButton conectado a un Outlet y un TouchUpInside.
Cuando enlazo solo uso el Outlet:
Todo lo que tenía que hacer era eliminar la conexión de acción (TouchUpInside) en XCode y eso lo resolvió.
PD: Supongo que esto está en su base todo relacionado con las respuestas anteriores y con @Chris Kaminski en particular, pero espero que esto ayude a alguien ...
Salud.
fuente
Tuve el mismo problema. El problema para mí fue que un botón tenía dos métodos de acción. Lo que hice fue crear un primer método de acción para mi botón y luego lo eliminé en el controlador de vista, pero olvidé desconectar la conexión en el guión gráfico principal en el inspector de conexiones. Entonces, cuando agregué un segundo método de acción, ahora había dos métodos de acción para un botón, lo que causó el error.
fuente
Para mí, fue una conexión sobrante creada en el creador de interfaces bij ctrl-dragging. El nombre de la conexión interrumpida estaba en el registro de errores.
Tuve una acción vinculada a un botón. Al presionar el botón se bloqueó la aplicación porque el Outlet ya no existía en mi código. Buscar el nombre en el registro me llevó a él en el guión gráfico. ¡Lo eliminé y el accidente desapareció!
fuente
Estoy respondiendo a Leonard Challis, ya que también estaba tomando la clase C193P de Stanford iOS, como era el usuario "oli206"
"Finalización de la aplicación debido a la excepción no detectada 'NSInvalidArgumentException', razón:"
El problema era que tenía el botón "Entrar" en la calculadora conectado dos veces, y un amigo señaló que al inspeccionar el botón en el Guión gráfico se mostraba que 2 entradas estaban en los atributos "Retocar adentro" cuando hice clic derecho en el botón "Entrar". Borrar uno de los dos "Eventos enviados" "Resolver dentro" resolvió el problema.
Esto demostró que el problema se desencadena (para la clase de video C193P en el Tutorial de la Calculadora en la Asignación 1) como 2 eventos enviados, uno de los cuales estaba causando la excepción.
fuente
Puede suceder cuando no asigna ViewController a ViewControllerScene en InterfaceBuilder. Por lo tanto, ViewController.m no está conectado a ninguna escena.
fuente
Incluyendo mi parte. Me quedé atrapado en esto por un tiempo, hasta que me di cuenta de que había creado un proyecto con ARC (referencia de conteo automático) deshabilitado. Un ajuste rápido a SÍ en esa opción resolvió mi problema.
fuente
Otra causa realmente tonta de esto es tener el selector definido en la interfaz (.h) pero no en la implementación (.m) (error tipográfico)
fuente
Otra razón / solución para agregar a la lista. Este es causado por iOS6.0 (y / o mala programación). En versiones anteriores, el selector coincidiría si los tipos de parámetros coincidieran, pero en iOS 6.0 tuve bloqueos en el código que funcionaba anteriormente donde el nombre del parámetro no era correcto.
Estaba haciendo algo como
pero en la definición (tanto .h como .m) tuve
Esto funcionó bien en iOS5 pero no en 6, incluso la misma compilación implementada en diferentes dispositivos.
De todos modos, no entiendo por qué el compilador no podría decirme esto: el problema se resolvió.
fuente
Esto también puede suceder cuando desea establecer una propiedad de un ControllerA en una propiedad pública dentro de una clase personalizada de ControllerB y aún no ha configurado la "Clase personalizada" dentro del inspector de identidad en los guiones gráficos.
fuente
Mi problema y solución fueron diferentes y pensé que debería publicarlo aquí para que los futuros lectores puedan evitar que su cabeza golpee la pared.
Estaba asignando diferentes xib al mismo UIVIewController e incluso después de buscar en todas partes no pude encontrar cómo corregirlo. Luego revisé mi AppDelegate donde estaba llamando
initWithNibName
y puedo ver que mientras copiaba el código, cambié el nombre de xib, pero olvidé cambiar laUIViewController
clase. Entonces, si ninguna de las soluciones funciona para usted, verifique suinitWithNibName
método.fuente
Me pasó a mí debido a argumentos de restricción conflictivos.
fuente