Exit é utilizado, para nos confundir um pouco!
Funciona assim, em dois passos: adicionamos um método com qualquer nome
na Segue para onde deseja-se retornar (por exemplo, resetarNavegacao) e que
receba um argumento do tipo UIStoryboardSegue, e ai na Segue de origem, que
irá disparar a ação, fazemos um link entre o botão e a ação de Unwind, ou Exit.
Para demonstrar, vamos definir que queremos voltar
da Segue Detalhes
( Inicio -> Listar -> Detalhes) para o início da app.
Para isso, adi-
cione uma nova classe chamada InicioViewController que herde de
UIViewController como feito anteriormente (não esqueça de informar o nome
dela no campo Custom Class do Identity Inspector na Storyboard). Ai abra o ar-
quivo InicioViewController.m e adicione o seguinte código:
-(IBAction)resetarNavegacao:(UIStoryboardSegue *) segue {
// Nao precisa de código
}
Veja que o corpo do método é vazio mesmo, embora você possa colocar algum
código caso queira - porém isso não é obrigatório.
Para o segundo passo, vá até a Segue Editar na Storyboard (não é necessá-
rio criar uma classe customizada) e adicione um botão com o texto Voltar para o
90
Casa do Código
Capítulo 5. Storyboards
início. Em seguida, selecione o botão, segure CTRL e clique + arraste para o bo-
tão verde, conforme mostra a imagem 5.16. No popup que abrir, selecione o item
resetarNavegacao.
Figura 5.16: Associar a ação Unwind a um botão
Rode o aplicativo e veja o resultado.
91
5.4. Passar dados de uma Segue para outra
Casa do Código
Informar se a Segue pode aceitar a ação de Unwind
Existe um método de implementação opcional que serve para indicar se aquele
controlador pode ou deve aceitar a ação de Unwind, com base em condicionais cri-
adas pelo desenvolvedor, como local (Segue) de origem e de destino. Caso este mé-
todo retorne YES. Um outro caso que ele pode ser necessário é quando a ação
de Unwind passa por diversas Segues intermediárias e o retorno acaba parando no
meio do caminho, mesmo quando não deveria. Nestes casos, portando, implemente
o método e retorne NO. Veja o código abaixo:
-(BOOL) canPerformUnwindSegueAction:(SEL)action
fromViewController:(UIViewController *)fromViewController
withSender:(id)sender {
return YES;
}
Retornar YES indica que o controlador pode manipular a ação de Unwind,
onde neste caso deverá ter também implementado o método indicado no popup do
botão verde, como feito anteriormente. Já NO faz a ação passar direto.
5.4
Passar dados de uma Segue para outra
Um detalhe fundamental com o uso de storyboards é que os controladores são cria-
dos automaticamente, portanto não temos como passar objetos e outras referências
pelo construtor, como geralmente é feito da forma manual. A abordagem consiste,
portanto, em sobrescrever um método especial existente em UIViewController
chamado prepareForSegue, o qual é executado momentos antes da transição
para a próxima Segue.
Este método passa como argumento informações sobre a Segue que está para ser
executada, incluindo seu identificador e a referência para o controlador. Com isso,
objetos podem ser atribuídos através de propriedades. Para demonstrar o conceito
é necessário mexer em dois controladores - o de origem e o de destino. No caso, a
intenção é passar dados para o controlador Detalhes (que ainda não foi criado),
vindo do Listar (o qual já criamos).
Primeiro crie um novo controlador chamado DetalhesViewController, e
associe-o à tela de detalhes através do campo Custom Class no Identity Inspector.
Além disso, adicione também um UILabel, fazendo a devida ligação com o ar-
92
Casa do Código
Capítulo 5. Storyboards
quivo DetalhesViewController.h, através da técnica de CTRL + clique
e arraste. A imagem 5.17 serve de referência.
Figura 5.17: Segue de Detalhes com a classe definida
Aproveitando que estamos mexendo no controlador de Detalhes, adicione uma
propriedade chamada descricaoDetalhes, que será aquela preenchida antes
de navegar para a Segue, através da tela de listagem. O código deverá ficar assim:
@interface DetalhesViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *infoLabel;
@property (nonatomic, retain) NSString *descricaoDetalhes;
@end
Feito isso, o próximo passo é interceptar o evento de navegação para a Segue, e
definir um valor para a propriedade descricaoDetalhes". Abra a classe
"ListarViewController.m
// Obs: não esqueça de importar o arquivo "%%DetalhesViewController.h%%"
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"listarParaDetalhesSegue"]) {
DetalhesViewController *dc = segue.destinationViewController;
93
5.4. Passar dados de uma Segue para outra
Casa do Código
dc.descricaoDetalhes = @"Conteúdo vindo da tela de listagem";
}
}
O código não tem maiores mistérios: primeiro verifica-se se a Segue que irá
ser exibida é a que queremos manipular, através do identificador definido anterior-
mente, e em seguida simplesmente pegamos a referência ao controlador para definir