error "selector no reconocido enviado a instancia" en Objective-C


Creé un botón y agregué una acción para él, pero tan pronto como se invocó, obtuve 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(@"---");
}
Author: Tamás Sengel, 2010-03-16

30 answers

Parece que no está administrando la memoria del controlador de vista correctamente y está siendo desasignado en algún momento, lo que hace que el método numberButtonClicked: se envíe a otro objeto que ahora ocupa la memoria que el controlador de vista ocupaba anteriormente...

Asegúrese de que está reteniendo/liberando correctamente su controlador de vista.

 171
Author: Jasarien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-16 14:40:08

Para aquellos que llegan aquí a través de Google como lo hice yo, que probablemente se refiere más a Xcode 4.2+/iOS 5+ más, lo que con ARC. Tuve el mismo error"selector no reconocido enviado a la instancia". En mi caso, tenía la acción de destino de un UIButton configurada para pasarse a sí misma como el parámetro remitente, pero más tarde me di cuenta de que no lo necesitaba y lo eliminé en código. Entonces, algo como:

- (IBAction)buttonPressed:(UIButton *)sender {

Se cambió a:

- (IBAction)buttonPressed {

Haciendo clic derecho en el UIButton en cuestión mostró que el Retoque Interior el evento se asoció con el método view controllers buttonPressed:. Eliminar esto y reasignarlo al método modificado funcionó como un placer.

 121
Author: LeonardChallis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-31 18:09:26

Esta fue la respuesta principal de Google para este problema, pero tenía una causa/resultado diferente - Pensé que añadiría mis dos centavos en caso de que otros tropiezan con este problema.

Tuve un problema similar esta mañana. Descubrí que si hace clic con el botón 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 hasta dos acciones. Eliminé las acciones del menú del botón derecho y las volví a cablear y mi problema se solucionó.

So asegúrate de que tus acciones estén bien conectadas.

 63
Author: Chris K,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-08 15:19:24

OK, tengo que chip 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 se usa:

action:@selector(xxxButtonClick:)

or (as in my case)

action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])

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 perderse los dos puntos si está creando dinámicamente el evento nombre.

Las opciones de código del receptor se ven así:

- (void)doneBtnTui:(id)sender {
  NSLog(@"Done Button - with sender");
}
 or
- (void)doneBtnTui {
  NSLog(@"Done Button - no sender");
}

Como de costumbre, siempre es la respuesta obvia la que se pierde.

 24
Author: Craig H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-20 16:33:42

En mi caso la función no esperaba un argumento pero el botón estaba configurado para enviar uno causando el error. Para arreglar esto tuve que volver a conectar el controlador de eventos.

Aquí está mi función:

introduzca la descripción de la imagen aquí

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):

introduzca la descripción de la imagen aquí

Observe que hay 3 controladores de eventos.

Para arreglar 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 de x junto al nombre de cada elemento hasta que no se mostraran elementos.

introduzca la descripción de la imagen aquí

A continuación tuve que volver a conectar el botón al evento. Para ello, mantenga pulsada la tecla Control y arrastre una línea desde el botón hasta la acción. Debería decir "Conectar Acción". Nota: Tuve que reiniciar XCode para que esto funcione por alguna razón; de lo contrario, solo me dejó insertar acciones (también conocido como crear una nueva acción) por encima o por debajo de la función.

introduzca la descripción de la imagen aquí

Ahora debería tener un solo controlador de eventos conectado al evento button que no pase argumentos:

introduzca la descripción de la imagen aquí

Esta respuesta complementa la respuesta de @Leonard Challis que deberías leer también.

 21
Author: 1.21 gigawatts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-05 21:48:50

Esto también puede suceder si no establece la "Clase" de la vista en interface builder.

 14
Author: user1658373,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-18 17:51:43

En mi caso, estaba usando NSNotificationCenter e intentaba usar un selector que no tomaba argumentos, sino que añadía dos puntos. La eliminación del colon solucionó el problema.

Cuando use un nombre de selector, no use dos puntos finales si no hay argumentos. Si hay un argumento, use un punto final. Si hay más de un argumento, debe nombrarlos junto con dos puntos finales para cada argumento.

Ver la respuesta de Adam Rosenfield aquí: Selectores en Objective C

 12
Author: Nathan Garabedian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:15

Tuve este problema con un proyecto Swift donde estoy creando los botones dinámicamente. Código del problema:

var trashBarButtonItem: UIBarButtonItem {
    return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked")
}

func newButtonClicked(barButtonItem: UIBarButtonItem) {
    NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
}

La solución fue añadir dos puntos completos': 'después de la acción: por ejemplo,

var trashBarButtonItem: UIBarButtonItem {
        return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:")
    }

    func newButtonClicked(barButtonItem: UIBarButtonItem) {
        NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).")
    }

Ejemplo Completo aquí: https://developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

 11
Author: FredL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-11 04:09:46

La causa más obvia de esto (incluida para completar) es lanzar incorrectamente un puntero y llamar a un método de la clase incorrecta.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
 5
Author: devios1,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-13 20:39:21

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 redimensionamiento - vea este howto en caso de que esté interesado) y olvidé agregar el *.m archivo al destino de compilación. Error estúpido, pero no siempre obvio cuando sucede dónde buscar. Pensé que valía la pena compartirlo...

 3
Author: Mirko Jahn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-07 10:23:22

Tuve el mismo error y descubrí lo siguiente:

Cuando se utiliza el código

[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];

Usted puede pensar que está buscando el selector:

- (void)yourRefreshMethod{
    (your code here)
}

Pero en realidad está buscando el selector:

- (void)yourRefreshMethod:(id)sender{
    (your code here)
}

Ese selector no existe, así que obtienes el bloqueo.

Puede cambiar el selector a recibir (id)remitente para resolver el error.

Pero, ¿qué pasa si tiene otras funciones que llaman a la función de actualización sin que proporcione un remitente? Necesitas una función que funcione para ambos. La solución fácil es agregar otra función:

- (void)yourRefreshMethodWithSender:(id)sender{
    [self yourRefreshMethod];
}

Y luego modificar el código pulldown de actualización para llamar a ese selector en su lugar:

[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];

También estoy haciendo el curso de Stanford iOS en un Mac antiguo que no se puede actualizar a la versión más reciente de Mac OSX. Así que todavía estoy construyendo para iOS 6.1, y esto resolvió el problema para mí.

 3
Author: Joseph Pride,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-25 17:37:20

Creo que deberías usar el void, en lugar del IBAction en return type. porque definiste un botón programáticamente.

 2
Author: Fa.Shapouri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-11 15:28:47

También tuve el mismo problema.

Borré mi uibutton en mi storyboard y lo recreé .. ahora todo funciona bien.

 2
Author: Yohan Dahmani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-11 15:10:01

Actualmente estoy aprendiendo el desarrollo de iOS y pasando por el libro "Comenzar el desarrollo de iOS6" de aPress. Estaba recibiendo el mismo error en el Capítulo 10: Storyboards.

Me llevó dos días averiguarlo, pero descubrí que accidentalmente establecí la etiqueta de la celda tableView en 1 cuando no debería haberlo hecho. Para cualquier otra persona que haga 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 empújame en la dirección correcta para averiguarlo (o al menos soy demasiado nuevo para entender el depurador, jajaja).

 1
Author: Shannon Cole,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-28 11:31:44

En mi caso estaba usando un UIWebView y pasé un NSString en el segundo parámetro en lugar de un NSURL. Así que sospecho que los tipos de clase incorrectos pasados a funciones pueden causar este error.

 1
Author: jbaylina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-02 21:20:40

..Y ahora la mía

Tuve el botón vinculado a un método que accedió al parámetro de otro botón y que funcionó muy bien, PERO tan pronto traté de hacer algo con el botón en sí, tuve un accidente. Durante la compilación, no se ha mostrado ningún error.. Solución?

No he podido vincular el botón al propietario del archivo. Así que si alguien aquí es tan estúpido como yo, intente esto:)

 1
Author: user2875404,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-24 17:55:52

Otra solución/caso ligeramente diferente.

Estoy usando Xamarin y MvvmCross y estaba tratando de vincular el UIButton a un ViewModel. Tenía el UIButton conectado a una toma de corriente y un retoque en el interior.

Al Enlazar solo uso la salida:

set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);

Todo lo que tenía que hacer era eliminar la conexión action (TouchUpInside) en XCode y eso lo resolvió.

P.d. Supongo que esto está en su base todo relacionado con las respuestas anteriores y a @ Chris Kaminski en particular, pero espero que esto ayude a alguien...

Saludos.

 1
Author: YKa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-20 00:35:48

Tuve el mismo problema. El problema para mí era 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 eliminarlo en el controlador de vista, pero olvidé desconectar la conexión en el guion gráfico principal en el inspector de conexión. Así que 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.

 1
Author: Harshil.Chokshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-01 22:22:33

Para mí, fue una conexión sobrante creada en interfacebuilder bij ctrl-dragging. El nombre de la conexión rota estaba en el error-log

*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'

Tenía 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 guion gráfico. ¡Lo borré y el accidente desapareció!

 1
Author: Tom Brinkkemper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-12 09:32:29

Esto le pasó a mi porque accidentalmente borrar el " @IBAction func... "dentro de mi código de clase UIViewController, por lo que en el Storyboard se creó el Outlet de Referencia, pero en tiempo de ejecución había cualquier función para procesarlo.

La solución fue eliminar la referencia de salida dentro del inspector de propiedades y luego volver a crearla arrastrándola con la tecla comando al código de clase.

Espero que ayude!

 1
Author: Guillermo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-14 15:03:41

Estoy respondiendo a Leonard Challis, ya que también estaba tomando la clase iOS de Stanford C193P, al igual que el usuario "oli206"

"Terminación de la aplicación debido a la excepción no capturada 'NSInvalidArgumentException', razón: "

El problema era que tenía el botón "Enter" en la calculadora conectado dos veces,y un amigo señaló que hacer una inspección del botón en el guion gráfico mostró que 2 entradas estaban en los atributos "Retocar Dentro" cuando hice clic derecho en el botón "Enter". Borrar uno de los dos "Retoques Dentro" "Eventos enviados" resolvió el problema.

Esto mostró que el problema se activa (para la clase de video C193P en el Recorrido de la Calculadora en la tarea 1) como 2 eventos enviados, uno de los cuales estaba causando la excepción.

 0
Author: Peter_from_NYC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-12 14:41:16

Puede suceder cuando no asigna el ViewController al ViewController en el InterfaceBuilder. Así que el ViewController.m no está conectado a ninguna escena.

 0
Author: Vincent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-11-15 12:13:19

Incluyendo mi parte. Me quedé atascado en esto por un tiempo, hasta que me di cuenta de que he creado un proyecto con ARC(Referencia de conteo automático) deshabilitado. Un ajuste rápido a SÍ en esa opción resolvió mi problema.

 0
Author: caiocpricci2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-03 21:24:32

Otra causa realmente tonta de esto es tener el selector definido en la interfaz(.h) pero no en la implementación(.m) (p. e.typo)

 0
Author: jla,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-13 10:54:40

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 coincidía si los tipos de parámetros coincidían, 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

[objectName methodName:@"somestring" lat:latValue lng:lngValue];

Pero en la definición (ambos .h y .m) Tenía

(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;

Esto funcionó bien en iOS5 pero no en 6, incluso la misma compilación implementada en diferentes dispositivo.

No entiendo por qué el compilador no podría decirme esto, de todos modos - problema soled.

 0
Author: Tim T,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-10 04:23:53

Esto también puede ocurrir cuando desea establecer una propiedad de un ControllerA a una propiedad pública dentro de una clase custom ControllerB y aún no ha establecido la "Clase Personalizada" dentro del inspector de identidad en storyboards.

 0
Author: Francisco Gutiérrez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-05 02:47:27

Otra posible solución: Añadir '-ObjC' a los argumentos del enlazador.

La explicación completa está aquí: Categorías de Objective-C en la biblioteca estática

Creo que lo esencial es: si la categoría está definida en una biblioteca con la que está enlazando estáticamente, el enlazador no es lo suficientemente inteligente como para enlazar en métodos de categoría. La bandera anterior hace que el enlace del enlazador en todas las clases y categorías de objective C, no solo las que piensa necesita en función del análisis de su fuente. (Por favor siente libre de afinar o corregir esa respuesta. Soy conocido a los idiomas vinculados, así que solo estoy repitiendo como loros aquí).

 0
Author: Russ Egan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:07

Mi problema y solución eran diferentes y pensé que debería publicarlo aquí para que los futuros lectores puedan salvar su cabeza de golpear 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 xib, pero olvidé cambiar la clase UIViewController. Así que si ninguna de las soluciones funciona para usted, compruebe su initWithNibName método.

 0
Author: noob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-10 22:13:00

Me sucedió debido a argumentos de restricción conflictivos.

 0
Author: Alex Bedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-07 23:36:12

Fundamentos: Invocación dinámica

El objective C es un lenguaje dinámico que invoca métodos mirando el tiempo de ejecución de métodos en clases. Por ejemplo, si hay Clase A incluyendo el método doSomething(arg1, arg2) . Si intenta llamar al método usando argumentos correctos en un objeto de Clase A todo funcionará bien. Sin embargo, si los argumentos no se pasan correctamente, por ejemplo, llamó al método con un solo argumento, entonces el tiempo de ejecución trate esto como una llamada de método para un método diferente. Eventualmente, run-time fallará en encontrar el método (doSomething con un argumento) y a través de esta excepción "selector no reconocido enviado a instancia".

Solución

Por favor, compruebe qué firma para @selector se espera. Por lo general, lo es, como se describe en el código

-(IBAction)numberButtonClick:(id)sender{
 0
Author: hadaytullah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-14 11:13:40