Pregunta

He creado un botón y agregó una función para ello, pero tan pronto como se invoca, tengo 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(@"---");
}
¿Fue útil?

Solución

Parece que no estás Administración de la memoria del controlador de vista correctamente y se está desasignado en algún momento - lo que hace que el método numberButtonClicked: que se enviará a otro objeto que ahora está ocupando la memoria que el controlador de vista ocupaba anteriormente. ..

Asegúrese de que está correctamente la retención / liberación de su controlador de vista.

Otros consejos

Para aquellos llegar aquí a través de Google como lo hice, lo que probablemente se refiere más a Xcode 4.2 + / iOS 5+ más, lo que con ARC. Yo tenía el mismo error " Selección no reconocido enviado a la instancia ". En mi caso tuve la acción objetivo de un UIButton listo para pasar a sí mismo como el parámetro remitente, pero más tarde me di cuenta que no lo necesitaba y quité de que en el código. Por lo tanto, algo como:

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

fue cambiado a:

- (IBAction)buttonPressed {

Haga clic en el UIButton en cuestión mostró que el evento de retoque interior se asoció con los controladores de vista buttonPressed: método. La eliminación de este y reasignar al método modificado funcionaba un lujo.

Esta era la parte superior Google respuesta a este problema, pero no tenía una causa / resultado diferente - pensé que me gustaría añadir mi granito de arena en el caso de que otros tropezar con este problema.

Yo tenía un problema similar esta misma mañana. He descubierto que si se hace clic derecho en el ítem de interfaz de usuario que le da el tema, se puede ver qué conexiones se han creado. En mi caso tuve un botón cable hasta dos acciones. He eliminado las acciones desde el menú del botón derecho y les recableados y mi problema fue corregido.

Así que asegúrese de que las acciones están cableados encima de la derecha.

OK, tengo que saltar aquí. El PO crea de forma dinámica el botón . Tenía un problema similar y la respuesta (después de horas de caza) es tan simple que me puso enfermo.

En el uso:

action:@selector(xxxButtonClick:)

or (as in my case)

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

Si se coloca una coma 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 obtendrá un error si se espera una. Es fácil pasar por alto el colon si va a crear dinámicamente el nombre del evento.

Las opciones de código receptor aspecto:

- (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 que consigue perder.

En mi caso, la función no se esperaba un argumento pero el botón se configura para enviar uno que causa el error. Para solucionar este problema que tenía que volver a colocar el controlador de eventos.

Aquí está mi función:

introducir descripción de la imagen aquí

Tenga en cuenta que no contiene argumentos.

Esta es una imagen de mi configuración del botón (botón derecho del ratón sobre el botón para visualizarla):

introducir descripción de la imagen aquí

Aviso hay 3 controladores de eventos.

Para solucionar este problema tuve que quitar cada uno de los elementos de eventos ya que uno de ellos fue el envío de una referencia a sí mismo a la función enterPressed. Para eliminar estos elementos que han hecho clic en el pequeño icono X junto al nombre de cada artículo hasta que no hubo elementos que se muestran.

introducir descripción de la imagen aquí

siguiente tenía que volver a conectar el botón para el evento. Para ello mantenga presionada la tecla Control y arrastre una línea desde el botón a la acción. Debe decir "Conectar acción". Nota: tuve que reiniciar XCode para que esto funcione por alguna razón; de lo contrario, solamente me deja insertar acciones (también conocido como crear una nueva acción) por encima o por debajo de la función.

introducir descripción de la imagen aquí

Ahora debe tener un solo controlador de eventos cableado al evento de botón que pasa sin argumentos:

introducir descripción de la imagen aquí

Esta respuesta complementa la respuesta por @Leonard Challis que debería leer también.

Esto también puede ocurrir si no se establece la "clase" de la vista en el constructor de interfaces.

En mi caso, yo estaba usando NSNotificationCenter y estaba tratando de utilizar un selector que tomó sin argumentos, pero estaba añadiendo dos puntos. La extirpación del colon fija el problema.

Cuando se utiliza un nombre de selección, no utilizar los dos puntos de fuga, si no hay argumentos. Si hay un argumento, utilice uno de colon de salida. Si hay más de un argumento, debe nombrarlos junto con dos puntos de fuga para cada argumento.

Véase la respuesta de Adam Rosenfield aquí: selectores en Objective-C

he tenido este problema con un proyecto Swift donde estoy creando los botones dinámicamente. código de 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 completo ':' 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 / biblioteca / content / samplecode / UICatalog / Listados / Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

La causa más evidente de esto (incluido por la totalidad) está lanzando incorrectamente un puntero y llamar a un método de la clase equivocada.

NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception

He tenido un problema similar, pero para mí la solución era ligeramente diferente. En mi caso, he usado una categoría para extender una clase existente (UIImage para algunas capacidades de cambio de tamaño - ver esto howto en caso de que esté interesado) y se olvidó de agregar el archivo * .m a la meta de construcción. error estúpido, pero no siempre es evidente cuando sucede dónde buscar. Pensé que vale la pena compartir ...

Yo tenía el mismo error y he descubierto 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)
}

Eso selector no existe, por lo que obtener el accidente.

Puede cambiar el selector para recibir (ID) del remitente con el fin de solucionar el error.

Pero lo que si usted tiene otras funciones que llaman a la función de actualización sin que proporciona un remitente? Es necesario una función que funcione para ambos. solución fácil es agregar otra función:

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

Y a continuación, modificar el código de actualización desplegable para llamar a ese selector 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 nueva versión de Mac OSX. Así que todavía estoy construyendo para iOS 6.1, y esta resuelto el problema para mí.

también tenía el mismo problema.

He eliminado mi UIButton en mi guión gráfico y la reconstruí .. ahora todo funciona bien.

Esto le pasó a mi, porque accidentalmente borrar el "func ... @IBAction" dentro de mi código de clase UIViewController, por lo que en el guión gráfico se creó la salida de referencia, pero en tiempo de ejecución no había ninguna función para procesarlo.

La solución fue la de suprimir la referencia de salida dentro del inspector de propiedades y luego volver a crearlo arrastrando con la tecla de comando para el código de clase.

Espero que ayude!

Creo que debería utilizar el vacío, en lugar de la IBAction en el tipo de cambio. ya ha definido un botón de programación.

Otra posible solución: Añadir '-ObjC' a sus argumentos enlazador

.

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

Creo que lo esencial es: si la categoría se define en una biblioteca se vincula estáticamente con, el enlazador no es lo suficientemente inteligente como para enlazar en los métodos categoría. La bandera anterior hace que el enlace enlazador en todas las clases y categorías C objetivas, no sólo los que piensa Tiene que basado en el análisis de su origen. (Por favor siéntase libre para sintonizar o corregir esa respuesta. Estoy sabía a lenguajes vinculados, por lo que sólo estoy repitiendo aquí).

Actualmente estoy aprendiendo el desarrollo de iOS y pasando por el libro "A partir Desarrollo iOS6" por aPulse. Que estaba recibiendo el mismo error en el capítulo 10:. Guiones gráficos

Me tomó dos días para averiguarlo, pero descubrió que provocó accidentalmente la etiqueta de la celda TableView a 1 cuando no debería haberlo hecho. Para cualquier otra persona haciendo este libro y recibir un error similar espero que esto ayude.

Realmente espero futuros errores en mi código son más fáciles de encontrar! jajaja. El error de depuración no hizo nada para empujar en la dirección correcta para calcular hacia fuera (o por lo menos soy demasiado nuevo para entender el depurador, lol).

En mi caso yo estaba usando un UIWebView y pasé por una NSString en el segundo parámetro en lugar de un NSURL. Por lo que sospecho que los tipos de clases equivocadas pasa a un funciones pueden causar este error.

.. Y ahora mis

tuve el botón vinculado a un método que accede parámetro de otro botón y que funcionaba muy bien, pero tan pronto me trató de hacer algo con el botón sí, tengo un accidente. Durante la compilación, se ha mostrado ningún error .. Solución?

No pude enlazar el botón para el propietario del archivo. Así que si alguien aquí es tan estúpido como yo, intente lo siguiente:)

Sin embargo, otro ligeramente diferente solución / caso.

Estoy utilizando Xamarin y MvvmCross y yo estaba tratando de obligar a la UIButton a un modelo de vista. Tuve la UIButton cableado hasta una salida y un TouchUpInside.

Cuando Encuadernación Yo sólo uso la salida:

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

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

P.S. Supongo que esto está en su base de toda relación con las respuestas anteriores y para @ Chris Kaminski, en particular, pero espero que esto ayude a alguien ...

Saludos.

Yo tenía el mismo problema. El problema para mí fue que tenía un botón de 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 borró en el controlador de la vista, pero se olvidó de desconectar la conexión en el guión gráfico principal en el inspector de conexión. Así que cuando he añadido un segundo método de acción, ahora había dos métodos de acción para un botón, lo que provocó el error.

Para mí, fue una conexión sobrante creada en InterfaceBuilder bij Ctrl-arrastre. 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'

Yo tenía una acción vinculada a un botón. Al pulsar el botón de la aplicación se estrelló debido a que la salida ya no existía en mi código. Buscar el nombre en el registro me llevó a él en el guión gráfico. Borrado, y el accidente se había ido!

En mi caso he resuelto el problema después de 2 horas:

El remitente (un elemento de barra de pestañas) fue no tener cualquier toma de Referencing . Por lo que apuntaba a ninguna parte.

Juste crear una toma de referencia correspondiente a su función.

Espero que esto podría ayudar a los chicos.

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

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

El problema era que tenía el botón "Enter" en la calculadora conectada dos veces, y un amigo señalé que hacer una inspección del botón en el guión gráfico mostró que 2 entradas estaban en el "Touch Up Inside" atributos cuando clic derecho en el botón "Enter". Borrado de uno de los dos "Touch en el interior", "Eventos enviados" resuelto el problema.

Esto demostró que el problema se activa (para la clase de vídeo C193P en la calculadora Tutorial sobre la cesión 1) como 2 eventos enviados, uno de los cuales estaba causando la excepción.

Puede ocurrir cuando no se asigna el ViewController a la ViewControllerScene en la InterfaceBuilder. Por lo que el ViewController.m no está conectado a cualquier escena.

La inclusión de mi parte. Me quedé atrapado en esto durante un tiempo, hasta que me di cuenta de que he creado un proyecto con ARC (referencia de conteo automático) discapacitados. Un conjunto rápida a SÍ a la opción que resolvió mi problema.

Otra causa realmente tonto de esto es el selector de haber definido en la interfaz (.h) pero no en la aplicación (.m) (e-h error tipográfico)

Otra razón / solución a añadir a la lista. Éste es causada por iOS6.0 (y / o mala programación). En las versiones más antiguas del selector se correspondería si los tipos de parámetros emparejados, pero en iOS 6.0 que tiene accidentes en el código de funcionamiento anterior, donde el nombre del parámetro no era correcta.

que estaba haciendo algo así como

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

pero en la definición (tanto .hy .m) que tenía

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

Esto funcionó muy bien en iOS5, pero no el 6, incluso exactamente la misma estructura desplegada en diferentes dispositivos.

No entiendo por qué el compilador coudn't dime esto, de todos modos - problema con suela

.

Esto también puede ocurrir cuando se quiere establecer una propiedad de un ControllerA a una propiedad pública dentro de una clase ControllerB costumbre y no se ha establecido la "clase personalizada" dentro del inspector de la identidad en guiones gráficos todavía.

Mi problema y la solución fue diferente y pensé que debía publicar aquí para que los futuros lectores pueden guardar su cabeza golpeando contra la pared.

Me estaba asignando diferentes XI ter del mismo UIViewController e incluso después de buscar por todos lados que no podía encontrar la manera de corregirlo. Entonces revisé mi AppDelegate donde yo estaba llamando initWithNibName y puedo ver que al copiar el código, he cambiado el nombre xib, pero se olvidó de cambiar de clase UIViewController. Así que si ninguno de la solución que funciona para usted, revise su método initWithNibName.

Pasó a mí a causa de conflicto argumentos de restricción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top