Eu tenho um controlador de exibição com uma exibição de tabela e uma ponta separada para o modelo de célula da tabela. O modelo de célula possui alguns botões. Desejo acessar o botão clicar junto com o índice da célula clicada dentro do controlador de exibição em que defini a exibição de Tabela.
Então eu tenho ViewController.h
e ViewController.m
onde eu tenho o UITableView
e TableTemplate.h
, TableTemplate.m
e TableTemplate.xib
onde eu tenho a ponta definida. Quero o evento de clique no botão com o índice de células ViewController.m
.
Alguma ajuda sobre como posso fazer isso?
fonte
Os delegados são o caminho a percorrer.
Como visto em outras respostas, o uso de visualizações pode ficar desatualizado. Quem sabe amanhã pode haver outro invólucro e talvez precise usar
cell superview]superview]superview]superview]
. E se você usar tags, você terá um número n de condições senão para identificar a célula. Para evitar tudo isso, configure os delegados. (Ao fazer isso, você criará uma classe de célula reutilizável. Você pode usar a mesma classe de célula que uma classe base e tudo que você precisa fazer é implementar os métodos de delegação.)Primeiro, precisamos de uma interface (protocolo) que será usada pela célula para comunicar (delegar) cliques no botão. ( Você pode criar um arquivo .h separado para o protocolo e incluir no controlador de exibição de tabela e nas classes de células personalizadas OU basta adicioná-lo na classe de célula personalizada, que será incluída no controlador de exibição de tabela )
Inclua esse protocolo no controlador de exibição de célula e tabela personalizado. E verifique se o controlador de exibição de tabela confirma este protocolo.
Na célula personalizada, crie duas propriedades:
No
UIButton
delegado IBAction, clique em: (O mesmo pode ser feito para qualquer ação na classe de célula personalizada que precise ser delegada novamente para visualizar o controlador )No controlador de exibição de tabela
cellForRowAtIndexPath
após remover a fila da célula, defina as propriedades acima.E implemente o delegado no controlador de exibição de tabela:
Essa seria a abordagem ideal para obter ações personalizadas de botão de célula no controlador de exibição de tabela.
fonte
Em vez de brincar com tags, adotei uma abordagem diferente. Fiz delegado para minha subclasse de UITableViewCell (OptionButtonsCell) e adicionei um indexPath var. No meu botão no storyboard, conectei o @IBAction ao OptionButtonsCell e enviei o método delegate com o indexPath correto para qualquer pessoa interessada. Na célula para o caminho do índice, defino o indexPath atual e ele funciona :)
Deixe o código falar por si:
Swift 3 Xcode 8
OptionButtonsTableViewCell.swift
MyTableViewController.swift
fonte
class MyTableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, OptionButtonsDelegate
// erro: conformidade redundante de 'MyTableViewController' ao protocolo 'UITableViewDataSource'Isso deve ajudar: -
Aqui remetente é a instância UIButton que está enviando o evento. myTableView é a instância UITableView com a qual você está lidando.
Basta acertar a referência da célula e todo o trabalho é feito.
Pode ser necessário remover os botões do contentView da célula e adicioná-los diretamente à instância UITableViewCell, pois é uma subview.
Ou
Você pode formular um esquema de nomeação de tags para diferentes UIButtons em cell.contentView. Usando essa tag, mais tarde você poderá conhecer as informações de linha e seção conforme necessário.
fonte
O código a seguir pode ajudá-lo.
Tomei
UITableView
com classe de célula protótipo personalizado chamadoUITableViewCell
dentroUIViewController
.Então eu tenho
ViewController.h
,ViewController.m
eTableViewCell.h
,TableViewCell.m
Aqui está o código para isso:
ViewController.h
ViewController.m
Classe de célula personalizada:
e
Nota : Aqui eu peguei todos
UIControls
usando o Storyboard.Espero que isso te ajude...!!!
fonte
A razão pela qual eu gosto abaixo da técnica, porque também me ajuda a identificar a seção da tabela.
Adicionar botão na célula cellForRowAtIndexPath:
Evento addTask:
Espera esta ajuda.
fonte
Use os fechos Swift:
fonte
O código de Tarun não funciona no iOS7, pois a estrutura UITableViewCell mudou e agora ele receberia "UITableViewCellScrollView".
Esta postagem Obtendo o UITableViewCell com superview no iOS 7 tem uma boa solução, criando um loop para encontrar a exibição pai correta, independentemente de quaisquer alterações futuras na estrutura. Tudo se resume a criar um loop:
O link possui código para uma solução mais reutilizável, mas isso deve funcionar.
fonte
Swift 2.2
Você precisa adicionar um destino para esse botão.
Nome da Função: conectado // por exemplo
E é claro que você precisa definir a tag desse botão, pois está usando.
Você pode conseguir isso subclassificando UITableViewCell. Use-o no construtor de interfaces, solte um botão nessa célula, conecte-o via tomada e pronto.
Para obter a tag na função conectada:
fonte
Swift 3 com um fechamento
Uma boa solução é usar um fechamento em um UITableViewCell personalizado para retornar o retorno ao viewController para uma ação.
Na célula:
In View Controller: Delegado do Tableview
fonte
Acho mais simples subclassificar o botão dentro do seu celular (Swift 3):
Na sua classe de célula:
Na fonte de dados da visualização de tabela ou de coleta, ao remover a fila da célula, forneça ao botão seu caminho de índice:
Portanto, você pode simplesmente colocar esses códigos no seu controlador de exibição de tabela:
E não se esqueça de definir a classe do botão no seu Interface Builder e vinculá-lo à
handleTapOnCellInfoButton
função!editado:
Usando injeção de dependência. Para configurar a chamada de fechamento:
e injete o fechamento no método willDisplay do delegado da exibição da coleção:
fonte
Seu trabalho para mim.
fonte
fonte
para swift 4:
fonte
Se você deseja passar o valor do parâmetro da célula para o UIViewController usando o encerramento,
fonte
A resposta do @Mani é boa, no entanto, as tags de visualizações no conteúdo da célula geralmente são usadas para outros fins. Você pode usar a tag da célula (ou a tag contentView da célula):
1) No seu
cellForRowAtIndexPath:
método, atribua a tag da célula como índice:2) Adicione alvo e ação ao seu botão, como abaixo:
3) Crie o método que retorna a linha do remetente (obrigado @Stenio Ferreira):
4) Codifique ações com base no índice:
fonte
CustomTableCell.h é um UITableViewCell:
MyVC.m após importações:
Dentro de "cellForRowAtIndexPath" em MyVC.m:
MyVC.m:
fonte
fonte