En MyClass.m, he definido
- (void) myTest: (NSString *) withAString{
NSLog(@"hi, %@", withAString);
}
y la declaración apropiada en MyClass.h. Luego quiero llamar
[self performSelector:@selector(mytest:withAString:) withObject: mystring];
en MyClass.m pero obtengo un error similar a * Finalización de la aplicación debido a la excepción no detectada 'NSInvalidArgumentException', razón: '* - [MyClass myTest: withAtring:]: selector no reconocido enviado a la instancia 0xe421f0'
Intenté un caso más simple con un selector que no tomó argumentos que imprimieron una cadena en la consola y que funcionó bien. ¿Qué tiene de malo el código y cómo puedo solucionarlo? Gracias.
Respuestas:
La firma de su método es:
withAString resulta ser el parámetro (el nombre es engañoso, parece que es parte de la firma del selector).
Si llama a la función de esta manera:
Funcionará.
Pero, como han sugerido los otros carteles, es posible que desee cambiar el nombre del método:
Y llama:
fuente
En Objective-C, la firma de un selector consiste en:
Los selectores no tienen conocimiento de:
Aquí hay una implementación de clase donde el método performMethodsViaSelectors realiza los otros métodos de clase por medio de selectores:
El método para el que desea crear un selector tiene una sola entrada, por lo que crearía un selector de esta manera:
fuente
@Shane Arney
Es posible que también desee mencionar que este método es solo para pasar un máximo de 2 argumentos, y no se puede retrasar. (tal como
performSelector:withObject:afterDelay:)
.un poco extraño que apple solo admita 2 objetos para enviar y no lo hizo más genérico.
fuente
Tu código tiene dos problemas. Uno fue identificado y respondido, pero el otro no. La primera fue que a su selector le faltaba el nombre de su parámetro. Sin embargo, incluso cuando arregla eso, la línea aún generará una excepción, suponiendo que la firma de su método revisado aún incluya más de un argumento. Digamos que su método revisado se declara como:
La creación de selectores para métodos que toman múltiples argumentos es perfectamente válida (por ejemplo, @selector (myTestWithString: compareTo :)). Sin embargo, el método performSelector solo le permite pasar un valor a myTest, que desafortunadamente tiene más de un parámetro. Se producirá un error y le dirá que no proporcionó suficientes valores.
Siempre puede redefinir su método para tomar una colección, ya que es el único parámetro:
Sin embargo, hay una solución más elegante (que no requiere refactorización). La respuesta es utilizar NSInvocation, junto con sus
setArgument:atIndex:
yinvoke
métodos.He escrito un artículo, incluido un ejemplo de código , si quieres más detalles. El enfoque está en el enhebrado, pero los conceptos básicos aún se aplican.
¡Buena suerte!
fuente
La firma de tu método no tiene sentido, ¿estás seguro de que no es un error tipográfico? No tengo claro cómo se está compilando, ¿aunque quizás recibas advertencias que ignoras?
¿Cuántos parámetros espera que tome este método?
fuente
Piensa que la clase debería definirse como:
Solo tiene un único parámetro, por lo que solo debe tener uno:
Es posible que desee considerar el uso de% @ en su NSLog también, es solo un buen hábito para entrar, luego escribirá cualquier objeto, no solo cadenas.
fuente
El documento de Apple dice que no hay una API disponible para esta característica y alguna otra característica esperada en un teclado personalizado. Por lo tanto, debe encontrar su propia lógica para implementar esto.
fuente