Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

Dúvida sobre navegação entre telas

Olá professor, tudo bem? Gostaria de inserir uma imagem aqui para facilitar o entendimento da dúvida, mas não consegui. Vou tentar explicar e usar nomes para facilitar a identificação:

Tenho um projeto onde uma tela de login (TELA A) (que possui navigation Controller) possui uma segue para um Tab bar controller. Este tabBarcontroller aponta para 2 Navigation Controllers. Um destes Navigation Controllers tem uma segue para uma ViewController (TELA B).

A TELA B possui uma segue para outra viewController (TELA C).

Na TELA C tem a função que oculta a barra da Navigation Controller: override func viewWillAppear(_ animated: Bool) { self.navigationController?.setNavigationBarHidden(true, animated: false) }

Na TELA C tem um botão que faz uma determinada ação e encerra esta tela. Para encerrar, estou utilizando o código: self.dismiss(animated: true, completion: nil)

Aí está o problema. Ele deveria retornar para a TELA B, mas está retornando para a TELA A (de login).

Ele está encerrando tudo o que vem pela Navigation Controller que está antes da TELA B.

Como faço para encerrar a TELA C e o app exibir a TELA B, com os valores que já estavam nela preenchidos pelo usuário (e não uma nova TELA B) ?

Muito obrigado professor.

6 respostas

Olá Fabrício, tudo bem?

Veja se eu entendi direito a estrutura do seu app:

estrutura tela

Se for o que eu imagino, na 'TELA C' você deve ter algum input de dados do usuário e você quer voltar esses dados para a 'TELA B' correto?

O layout está perfeito. Na tela C tem 2 botões. Cada um faz uma ação e encerra a tela. Para salvar o que preciso de C e transferir para B eu usei uma variável "geral". (Fora de todas as classes, acessível de qualquer lugar). É apenas um String. Então salvar nesta variável e recuperar em B e em outros lugares tá OK.

O problema é só encerrar C e retornar para B. Porque ao usar self.dismiss ele retorna para A.

solução!

Olá Fabrício,

Se o problema for apenas voltar para a tela anterior, como você está utilizando um navigationController basta utilizar o método 'popViewController':

self.navigationController?.popViewController(animated: true)

Uma dica é se você precisar retornar uma string da 'telaC' para a 'telaB' eu evitaria utilizar essa variável global (a não ser que seja realmente necessário) e utilizaria um bloco de completion em uma closure.

Dessa forma:

apagar o segue do botão

Nesse caso, vamos fazer o push para tela C programaticamente. Para isso, precisamos colocar um identificador no ViewController:

identificador do ViewController

Com o identificador criado, vamos implementar um método para instanciar a 'TELA C' quando for disparado a ação do botão na 'TELA B':

ViewController Tela C:

método

Agora, é só chamar a tela programaticamente na ação do botão na 'TELA B':

fazendo push da tela

Com o bloco de completion conseguimos passar por parâmetro qualquer tipo de variável.

Espero ter ajudado ;]

Nossa. Muito obrigado por toda a explicação!

Eu não estou com o Mac neste momento. Devo demorar alguns dias para implementar a sua dica.

Fazendo lá eu retorno aqui para lhe falar o resultado.

Mas de antemão, fico muito agradecido por toda a dedicação na elaboração da resposta, incluindo as imagens. Tudo muito bem detalhado e explicado.

Parabéns!

Vou implementar o retorno que você explicou e também a passagem de parâmetros entre as duas telas.

Um grande abraço!

Legal.

Depois me conta se deu certo

Abraço.

Boa tarde professor.

Fiz o teste inicial de encerrar a tela com self.navigationController?.popViewController(animated: true) e deu certo.

Em seguida fiz as modificações para descartar a variável global e deu certo também.

Confesso que demorei a entender a lógica neste processo uma vez que tudo acontece na Tela C, mas consegui compreender.

Muito obrigado mesmo pela ajuda.

Estou fazendo uma pós em Mobile e para o projeto final do módulo iOS usarei essa sua dica.

OBS: Concluí seu curso de layout iOS e achei fantástico!

Um grande abraço!