Estou tentando passar um parâmetro extra para a ação buttonClicked, mas não consigo descobrir qual deve ser a sintaxe em Swift.
button.addTarget(self, action: "buttonClicked:", forControlEvents: UIControlEvents.TouchUpInside)
Qualquer método meu buttonClicked:
func buttonClicked(sender:UIButton)
{
println("hello")
}
Alguém tem alguma ideia?
Obrigado pela ajuda.
WARNING TO INTERNET: please check out my answer at the bottom
Respostas:
Você não pode passar parâmetros personalizados em
addTarget:
. Uma alternativa é definir atag
propriedade do botão e trabalhar com base na tag.Ou para Swift 2.2 e superior:
Agora faça a lógica baseada na
tag
propriedadefonte
Int
. Nada mais.Se você deseja enviar parâmetros adicionais para o método buttonClicked, por exemplo, um indexPath ou urlString, você pode criar uma subclasse de UIButton:
Certifique-se de alterar a classe do botão no inspetor de identidade para subclassedUIButton. Você pode acessar os parâmetros dentro do método buttonClicked usando
sender.indexPath
ousender.urlString
.Nota: Se o seu botão estiver dentro de uma célula, você pode definir o valor desses parâmetros adicionais no método cellForRowAtIndexPath (onde o botão é criado).
fonte
Agradeço a todos que dizem usar tags, mas você realmente precisa estender a classe UIButton e simplesmente adicionar o objeto lá.
As tags são uma maneira impossível de contornar isso. Estenda o UIButton assim (no Swift 4)
então sua chamada pode ser chamada (NOTE OS dois pontos ":" em
Selector(("webButtonTouched:"))
)então finalmente pegue tudo aqui
Você faz isso uma vez e usa em todo o seu projeto (você pode até fazer a classe filha ter um "objeto" genérico e colocar o que quiser no botão!). Ou use o exemplo acima para colocar um número inesgotável de parâmetros de chave / string no botão. Muito útil para incluir coisas como urls, metodologia de mensagem de confirmação, etc.
Como um aparte, é importante que a
SO
comunidade perceba que existe toda uma geração de práticas ruins sendo cortadas e coladas na internet por um número alarmante de programadores que não entendem / não foram ensinados / erraram o ponto de O conceito deobject extensions
fonte
Para Swift 3.0, você pode usar o seguinte
fonte
Swift 4.2
Resultado:
No arquivo
UIButton+Events.swift
, criei um método de extensão paraUIButton
que vincula umUIControl.Event
a um manipulador de conclusão chamadoEventHandler
:O motivo pelo qual usei uma classe personalizada para vincular o evento é para poder descartar a referência posteriormente, quando o botão for desintializado. Isso evitará que ocorra um possível vazamento de memória. Isso não foi possível dentro de
UIButton
sua extensão, pois não tenho permissão para implementar uma propriedade nem odeinit
método.fonte
Se você tem uma série de botões como eu, pode tentar algo assim
fonte
Código Swift 4.0 (lá vamos nós de novo)
A ação chamada deve ser marcada assim porque essa é a sintaxe da função swift para exportar funções para a linguagem c objetiva.
crie algum botão funcional:
fonte
Código Swift 5.0
Eu uso theButton.tag, mas se eu tiver bastante tipo de opção, é um caso de switch muito longo.
.
fonte
Para Swift 2.X e superior
fonte
Código Swift 3.0
Você pode enviar o valor em 'userinfo' e usá-lo como parâmetro na função.
fonte
Este é mais um comentário importante. Compartilhamento de referências de sytanx que são aceitáveis fora da caixa. Para soluções de hack, olhe para outras respostas.
De acordo com os documentos da Apple, as Definições de Método de Ação devem ser uma dessas três. Qualquer outra coisa não é aceita.
fonte