Estou usando addTarget: action: forControlEvents como este:
[newsButton addTarget:self
action:@selector(switchToNewsDetails)
forControlEvents:UIControlEventTouchUpInside];
e gostaria de passar parâmetros para o meu seletor "switchToNewsDetails". A única coisa que consigo fazer é passar o remetente (id) escrevendo:
action:@selector(switchToNewsDetails:)
Mas estou tentando passar variáveis como valores inteiros. Escrever dessa maneira não funciona:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i)
forControlEvents:UIControlEventTouchUpInside];
Escrever dessa maneira também não funciona:
int i = 0;
[newsButton addTarget:self
action:@selector(switchToNewsDetails:i:)
forControlEvents:UIControlEventTouchUpInside];
Qualquer ajuda seria apreciada :)
ios
objective-c
iphone
cocoa-touch
uicontrolevents
Pierre Espenan
fonte
fonte
Respostas:
Você não passa parâmetros para o
switchToNewsDetails:
método aqui. Você acabou de criar um seletor para tornar o botão capaz de chamá-lo quando determinada ação ocorrer (retocar no seu caso). Os controles podem usar 3 tipos de seletores para responder às ações, todos com significado predefinido de seus parâmetros:sem parâmetros
com 1 parâmetro indicando o controle que envia a mensagem
Com 2 parâmetros indicando o controle que envia a mensagem e o evento que acionou a mensagem:
Não está claro o que exatamente você tenta fazer, mas, considerando que deseja atribuir um índice de detalhes específico a cada botão, você pode fazer o seguinte:
No
switchToNewsDetails:
método, você pode obter esse índice e abrir detalhes apropriados:fonte
[button.layer setValue:yourObject forKey:@"anyKey"];
e, em seguida, no método, marque(objectClass *)[button.layer valueForKey:@"anyKey"];
É como uma versão mais gratuita de.tag
Para passar parâmetros personalizados junto com o botão, basta SUBCLASS UIButton .
(O ASR está ativado, não há liberações no código.)
Este é o myButton.h
Este é myButton.m
Uso:
Recebendo a função:
Se você precisar que eu seja mais específico em qualquer parte do código acima, fique à vontade para perguntar sobre isso nos comentários.
fonte
tag
propriedade nas visualizações do Android . Eles podem armazenar qualquer objeto. E você também pode armazenar objetos por chave, como em um Dicionário / Mapa.A Target-Action permite três formas diferentes de seletor de ações:
fonte
Precisa de mais do que apenas um (int) via .tag? Use KVC!
Você pode transmitir quaisquer dados que desejar através do próprio objeto de botão (acessando o ditado de KeyAvalue do CALayers).
Defina seu destino assim (com o ":")
Adicione seus dados ao próprio botão (bem como o
.layer
do botão que está) assim:Então, quando o botão é pressionado, você pode verificá-lo assim:
fonte
Eu fiz uma solução baseada em parte pelas informações acima. Acabei de definir o titlelabel.text como a string que desejo passar e defina o titlelabel.hidden = YES
Como isso :
Dessa forma, não há necessidade de herança ou categoria e não há vazamento de memória
fonte
Eu estava criando vários botões para cada número de telefone em uma matriz, de modo que cada botão precisava de um número de telefone diferente para ligar. Usei a função setTag, pois estava criando vários botões em um loop for:
Então, na minha chamada: method, usei o mesmo para loop e uma instrução if para escolher o número de telefone correto:
fonte
- (void)call:(UIButton *)sender { NSString *phoneNumber = _phoneNumbers[i]; NSString *callString = [NSString stringWithFormat:@"telprompt://%@", phoneNumber]; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:callString]]; }
Como existem várias maneiras mencionadas aqui para a solução, exceto o recurso de categoria.
Por exemplo (ex):
na sua visualização Controller.m
Manipulador de eventos:
fonte
Você pode substituir a ação de destino por um fechamento (bloco no Objective-C) adicionando um wrapper auxiliar de fechamento (ClosureSleeve) e adicionando-o como um objeto associado ao controle para que ele seja retido. Dessa forma, você pode passar quaisquer parâmetros.
Swift 3
Uso:
fonte
self.switchToNewsDetails(parameter: i)
) disparar 2 vezes, por me ajudarbutton.addAction()
duas vezes. Adicione um ponto de interrupçãobutton.addAction
e também na primeira linha dentro do fechamento e tente depurar você mesmo.Existe uma outra maneira, na qual você pode obter o indexPath da célula onde seu botão foi pressionado:
usando o seletor de ação usual como:
e depois em yourFunction:
desde que você obtenha um indexPath, ele se torna muito mais simples.
fonte
Veja meu comentário acima e acredito que você precise usar o NSInvocation quando houver mais de um parâmetro
mais informações sobre o NSInvocation aqui
http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
fonte
Isso corrigiu o meu problema, mas travava, a menos que eu mudasse
para
fonte
Subclassifiquei UIButton no CustomButton e adiciono uma propriedade onde armazeno meus dados. Por isso, chamo o método: (CustomButton *) remetente e, no método, só leio meus dados sender.myproperty.
Exemplo CustomButton:
Ação do método:
Atribuir ação
fonte
Se você quiser apenas alterar o texto do leftBarButtonItem mostrado pelo controlador de navegação junto com a nova visualização, você pode alterar o título da visualização atual antes de chamar pushViewController para o texto desejado e restaurá-lo no retorno de chamada viewHasDisappered para exibições futuras de a visão atual.
Essa abordagem mantém a funcionalidade (popViewController) e a aparência da seta mostrada intactas.
Funciona para nós pelo menos com o iOS 12, construído com o Xcode 10.1 ...
fonte