Eu envio o usuário para uma página com um clique no botão. Esta página é um UITableViewController .
Agora, se o usuário tocar em uma célula, eu gostaria de empurrá-lo de volta para a página anterior.
Eu pensei em algo como, self.performSegue("back")....
mas isso parece ser uma má idéia.
Qual é a maneira correta de fazer isso?
Respostas:
Swift 3:
Se você deseja voltar ao controlador de exibição anterior
Se você deseja voltar ao controlador de visualização raiz
fonte
.popViewController(animated: true)
_ = self.navigationController?.popToRootViewController(animated: true)
_ =
é a convenção rápida para isso.Swift 3 , Swift 4
navigationController é opcional porque pode não haver um.
fonte
[weak self]
eself?.navigationController?.
override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if let vc = segue.destination as?
Mas quando eu uso isso eu não posso usar issoSwift 3
Talvez eu esteja atrasado na resposta, mas no Swift 3 você pode fazer o seguinte:
fonte
dismiss:
não apenas descartará o controlador de exibição atual, mas também o controlador de exibição raiz, e não foi o que foi solicitado aqui.dismiss(animated: true, completion: nil)
não funciona após a rotação!Swift 4
existem duas maneiras de retornar / voltar ao ViewController anterior:
self.navigationController?.pushViewController(yourViewController, animated: true)
neste caso, você precisa usarself.navigationController?.popViewController(animated: true)
self.present(yourViewController, animated: true, completion: nil)
neste caso, você precisa usarself.dismiss(animated: true, completion: nil)
fonte
No caso em que você apresentou um
UIViewController
de dentro de umUIViewController
ie ..Simplesmente chame a
dismiss
função:fonte
self.dismiss(animated: true)
- não funciona após rotaçãorápido 5 e acima
caso 1: usando com o controlador de navegação
caso 2: usando com o controlador de exibição atual
fonte
Se Segue for 'Show' ou 'Push', você poderá chamar "popViewController (animated: Bool)" na instância de UINavigationController. Ou se segue é uma espécie de "presente", em seguida, chame "dispensar (animado: Bool, conclusão: (() -> Vazio)?)") Com a instância do UIViewController
fonte
para o swift 3, você só precisa escrever a seguinte linha de código
fonte
Experimente o seguinte: para a visualização anterior, use o seguinte:
pop to root use este código:
fonte
Swift 4.0 Xcode 10.0 com um TabViewController como última visualização
Se o seu último ViewController estiver incorporado em um TabViewController, o código abaixo o enviará para a raiz ...
Mas se você realmente deseja voltar para a última visualização (pode ser a visualização Tab1, Tab2 ou Tab3 ..), é necessário escrever o código abaixo:
Isso funciona para mim, eu estava usando uma exibição depois de um dos meus TabView :)
fonte
Para perguntas sobre como incorporar o seu viewController a um navigationController no storyboard:
fonte
Este funciona para mim (Swift UI)
fonte
Eu fiz assim
fonte
Eu gostaria de sugerir outra abordagem para esse problema. Em vez de usar o controlador de navegação para exibir um controlador de exibição, use o desenrolar segues. Esta solução tem algumas, mas realmente importantes, vantagens:
Você pode encontrar mais detalhes em Desbobrar segmentos passo a passo . O how to é melhor explicado no link anterior, incluindo como enviar dados de volta, mas aqui farei uma breve explicação.
1) Vá para o controlador de exibição de destino (não a origem) e adicione um segue para descontrair:
2) CTRL arraste do próprio controlador de exibição para o ícone de saída no controlador de exibição de origem:
3) Selecione a função de desenrolar que você acabou de criar alguns momentos atrás:
4) Selecione os passos de desenrolamento e dê um nome:
5) Vá para qualquer local do controlador de exibição de origem e chame o seguinte para descontrair:
Descobri bastante essa abordagem quando sua navegação começa a ficar complicada.
Espero que isso ajude alguém.
fonte
Posso redirecionar para a página raiz escrevendo código em "viewDidDisappear" do controlador navegado,
override func viewDidDisappear(_ animated: Bool) { self.navigationController?.popToRootViewController(animated: true) }
fonte