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:
- O controlador de origem pode voltar para qualquer outro controlador de destino (não apenas o anterior) sem saber nada sobre o destino.
- As sequências push e pop são definidas no storyboard, portanto, nenhum código de navegação nos controladores de exibição.
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:
@IBAction func unwindToContact(_ unwindSegue: UIStoryboardSegue) {
//let sourceViewController = unwindSegue.source
// Use data from the view controller which initiated the unwind segue
}
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:
performSegue(withIdentifier: "unwindToContact", sender: self)
Descobri bastante essa abordagem quando sua navegação começa a ficar complicada.
Espero que isso ajude alguém.