No MyClass.m, eu defini
- (void) myTest: (NSString *) withAString{
NSLog(@"hi, %@", withAString);
}
e a declaração apropriada em MyClass.h. Mais tarde eu quero ligar
[self performSelector:@selector(mytest:withAString:) withObject: mystring];
em MyClass.m, mas recebo um erro semelhante a * Terminando o aplicativo devido à exceção não capturada 'NSInvalidArgumentException', motivo: '* - [MyClass myTest: withAtring:]: seletor não reconhecido enviado para a instância 0xe421f0'
Tentei um caso mais simples com um seletor que não aceitava argumentos que imprimissem uma string no console e que funcionasse bem. O que há de errado com o código e como posso corrigi-lo? Obrigado.
objective-c
selector
Stu
fonte
fonte
Respostas:
Sua assinatura do método é:
passa a ser o parâmetro withAString (o nome é enganoso, parece que faz parte da assinatura do seletor).
Se você chamar a função desta maneira:
Vai funcionar.
Mas, como os outros pôsteres sugeriram, você pode renomear o método:
E ligue para:
fonte
No Objective-C, a assinatura de um seletor consiste em:
Os seletores não têm conhecimento de:
Aqui está uma implementação de classe em que o método performMethodsViaSelectors executa os outros métodos de classe por meio de seletores:
O método para o qual você deseja criar um seletor possui uma única entrada; portanto, você deve criar um seletor para o seguinte:
fonte
@Shane Arney
Você também pode mencionar que esse método é apenas para passar no máximo 2 argumentos e não pode ser adiado. (como
performSelector:withObject:afterDelay:)
.meio estranho que a apple suporte apenas 2 objetos a serem enviados e não a torne mais genérica.
fonte
Seu código tem dois problemas. Um foi identificado e respondido, mas o outro não. A primeira foi a falta do nome do parâmetro no seu seletor. No entanto, mesmo quando você corrige isso, a linha ainda gera uma exceção, supondo que a assinatura do método revisado ainda inclua mais de um argumento. Digamos que seu método revisado seja declarado como:
Criar seletores para métodos que usam vários argumentos é perfeitamente válido (por exemplo, @selector (myTestWithString: compareTo :)). No entanto, o método performSelector apenas permite que você transmita um valor para myTest, que infelizmente possui mais de um parâmetro. Irá ocorrer um erro e informar que você não forneceu valores suficientes.
Você sempre pode redefinir seu método para obter uma coleção, pois é apenas um parâmetro:
No entanto, existe uma solução mais elegante (que não requer refatoração). A resposta é a utilização de NSInvocation, juntamente com os seus
setArgument:atIndex:
einvoke
métodos.Escrevi um artigo, incluindo um exemplo de código , se você quiser mais detalhes. O foco está na segmentação, mas o básico ainda se aplica.
Boa sorte!
fonte
Sua assinatura de método não faz sentido, você tem certeza de que não é um erro de digitação? Não sei ao certo como está compilando, embora talvez você esteja recebendo avisos que está ignorando?
Quantos parâmetros você espera que esse método tome?
fonte
Pense que a classe deve ser definida como:
Você só tem um único parâmetro, portanto, apenas um:
Você também pode considerar o uso de% @ no NSLog - é apenas um bom hábito - escreverá qualquer objeto - não apenas as strings.
fonte
O documento da Apple está dizendo que não há API disponível para esse recurso e algum outro recurso esperado em um teclado personalizado. então você precisa descobrir sua própria lógica para implementar isso.
fonte