Eu tenho muitas anotações em um mapview (com rightCalloutAccessory
botões). O botão executará uma sequência disso mapview
para a tableview
. Quero passar tableview
um objeto diferente (que contém dados), dependendo de qual botão da chamada foi clicado.
Por exemplo: (totalmente inventado)
- anotação1 (Austin) -> passar dados obj 1 (relevante para Austin)
- anotação2 (Dallas) -> passar dados obj 2 (relevante para Dallas)
- annotation3 (Houston) -> passa dados obj 3 e assim por diante ... (você entendeu)
Consigo detectar em qual botão da frase de destaque foi clicado.
Estou usando prepareForSegue
: para passar o objeto de dados para o destino ViewController
. Como não posso fazer esta chamada, use um argumento extra para o objeto de dados que eu exijo, quais são algumas maneiras elegantes de obter o mesmo efeito (objeto de dados dinâmicos)?
Qualquer dica seria apreciada.
ios
xcode
uitableview
mapkit
storyboard
chiar
fonte
fonte
Respostas:
Simplesmente pegue uma referência ao controlador de exibição de destino no
prepareForSegue:
método e passe todos os objetos que você precisar para lá. Aqui está um exemplo ...REVISÃO: Você também pode usar o
performSegueWithIdentifier:sender:
método para ativar a transição para uma nova visualização com base em uma seleção ou pressionamento de botão.Por exemplo, considere que eu tinha dois controladores de exibição. O primeiro contém três botões e o segundo precisa saber qual desses botões foi pressionado antes da transição. Você pode conectar os botões a um
IBAction
código que usa operformSegueWithIdentifier:
método, como este ...EDIT: O aplicativo de demonstração que anexei originalmente agora tem seis anos, então o removi para evitar qualquer confusão.
fonte
[vc setMyObjectHere:object];
isso dinamicamente. ou seja, obj1 para o botão1, obj2 para o botão2 O problema é que não consigo passar um argumento. Existe uma maneira de contornar isso?Às vezes, é útil evitar criar uma dependência em tempo de compilação entre dois controladores de exibição. Veja como você pode fazer isso sem se preocupar com o tipo de controlador de exibição de destino:
Portanto, desde que o seu controlador de exibição de destino declare uma propriedade pública, por exemplo:
você pode definir essa propriedade no controlador de exibição anterior, como descrevi acima.
fonte
setMyData:
. Isso é uma dependência. O fato de você usar um seletor para evitar o erro de compilação deve ser tratado como um ponto fraco da sua abordagem, não como um benefício. É chocante para mim quantos desenvolvedores perderam o conceito de que erros de tempo de compilação devem ser preferidos a erros de tempo de execução.No Swift 4.2, eu faria algo assim:
fonte
Eu tenho uma classe de remetente , assim
Eu uso essa classe de remetente para passar objetos para
prepareForSeque:sender:
fonte
prepareForSegue
ou estamos implementando -lo e a suposição é prepareForSegue é chamado em si, ou seja, nós não precisamos fazer algo como[self prepareForSegue]
Me deparei com essa pergunta quando estava tentando aprender como passar dados de um View Controller para outro. Eu preciso de algo visual para me ajudar a aprender, então essa resposta é um complemento para as outras que já estão aqui. É um pouco mais geral do que a pergunta original, mas pode ser adaptada para funcionar.
Este exemplo básico funciona assim:
A idéia é passar uma sequência do campo de texto no First View Controller para o rótulo no Second View Controller.
First View Controller
Second View Controller
Lembrar de
UITextField
eUILabel
.Fonte
Como enviar dados através de segue (swift) (tutorial do YouTube)
Veja também
Controladores de exibição: transmitindo dados para frente e retornando dados (resposta completa)
fonte
Para Swift, use isso,
fonte
Eu implementei uma biblioteca com uma categoria no UIViewController que simplifica essa operação. Basicamente, você define os parâmetros que deseja passar em um NSDictionary associado ao item de interface do usuário que está executando as seguintes etapas. Também funciona com segues manuais.
Por exemplo, você pode fazer
para um segue manual ou crie um botão com um segue e use
Se o controlador da visualização de destino não for compatível com a codificação de valor-chave de uma chave, nada acontecerá. Também funciona com valores-chave (útil para descontrair segues). Confira aqui https://github.com/stefanomondino/SMQuickSegue
fonte
Minha solução é semelhante.
fonte
Basta usar esta função.
fonte
Usei essa solução para manter a invocação dos segue e a comunicação de dados na mesma função:
Um caso de uso seria algo como:
Isso parece funcionar para mim, no entanto, não tenho 100% de certeza de que as funções de execução e preparação sejam sempre executadas no mesmo encadeamento.
fonte