Steil Rafael - iOS: Programe para iPhone e iPad стр 23.

Шрифт
Фон

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

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке