Uma opção seria implementar seu próprio botão voltar personalizado. Você precisaria adicionar o seguinte código ao seu método viewDidLoad:
- (void) viewDidLoad {
[super viewDidLoad];
self.navigationItem.hidesBackButton = YES;
UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(back:)];
self.navigationItem.leftBarButtonItem = newBackButton;
}
- (void) back:(UIBarButtonItem *)sender {
// Perform your custom actions
// ...
// Go back to the previous ViewController
[self.navigationController popViewControllerAnimated:YES];
}
ATUALIZAR:
Aqui está a versão do Swift:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.Bordered, target: self, action: "back:")
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
self.navigationController?.popViewControllerAnimated(true)
}
ATUALIZAÇÃO 2:
Aqui está a versão do Swift 3:
override func viewDidLoad {
super.viewDidLoad()
self.navigationItem.hidesBackButton = true
let newBackButton = UIBarButtonItem(title: "Back", style: UIBarButtonItemStyle.plain, target: self, action: #selector(YourViewController.back(sender:)))
self.navigationItem.leftBarButtonItem = newBackButton
}
func back(sender: UIBarButtonItem) {
// Perform your custom actions
// ...
// Go back to the previous ViewController
_ = navigationController?.popViewController(animated: true)
}
Substituir o botão por um personalizado, conforme sugerido em outra resposta, possivelmente não é uma boa ideia, pois você perderá o comportamento e o estilo padrão.
Uma outra opção que você tem é implementar o método viewWillDisappear no View Controller e procurar uma propriedade chamada isMovingFromParentViewController . Se essa propriedade for verdadeira, significa que o View Controller está desaparecendo porque está sendo removido (exibido).
Deve ser algo como:
No veloz 4.2
fonte
override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) if isMovingFromParentViewController { // Your code... } }
viewWillDisappear(animated:)
será acionado se você receber uma ligação. Provavelmente não é o que você deseja. Provavelmente melhor usarwillMove(toParentViewController:)
fonte
parent == nil
é quando estamos nos movendo de volta àparent
cenaConsegui fazer isso com o seguinte:
Swift 3
Swift 4
Não há necessidade de botão voltar personalizado.
fonte
Eu criei essa classe (rápida) para criar um botão voltar exatamente como o normal, incluindo a seta para trás. Pode criar um botão com texto normal ou com uma imagem.
Uso
CustomBackButtonClass
(código para desenhar a seta para trás criada com o plugin Sketch & Paintcode)
SWIFT 3.0
fonte
Se você quiser ter o botão Voltar com a seta para trás, use uma imagem e código abaixo
backArrow.png [email protected] [email protected]
fonte
Se você estiver usando
navigationController
, adicione oUINavigationControllerDelegate
protocolo à classe e adicione o método delegate da seguinte maneira:Este método é chamado sempre que o controlador de navegação deslizar para uma nova tela. Se o botão Voltar foi pressionado, o novo controlador de exibição é o
ViewController
próprio.fonte
No Swift 5 e no Xcode 10.2
Por favor, não adicione item de botão de barra personalizado, use esse comportamento padrão.
Não há necessidade de viewWillDisappear , não há necessidade de BarButtonItem personalizado etc ...
É melhor detectar quando o VC é removido do pai.
Use qualquer uma dessas duas funções
Se você deseja interromper o comportamento padrão do botão Voltar, adicione BarButtonItem personalizado.
fonte
NÃO
override func willMove(toParentViewController parent: UIViewController?) { }
Isso será chamado mesmo se você estiver seguindo para o controlador de exibição no qual está substituindo esse método. Em que verificar se o "
parent
" é ounil
não não é uma maneira precisa de voltar ao corretoUIViewController
. Para determinar exatamente seUINavigationController
está navegando corretamente de volta aoUIViewController
que apresentou este atual, você precisará estar em conformidade com oUINavigationControllerDelegate
protocolo.SIM
nota:
MyViewController
é apenas o nome do queUIViewController
você deseja detectar voltando.1) Na parte superior do seu arquivo, adicione
UINavigationControllerDelegate
.2) Adicione uma propriedade à sua classe que acompanhará o
UIViewController
que você está seguindo.3) em
MyViewController
'sviewDidLoad
Atribuir métodoself
como delegado para o seuUINavigationController
.3) Antes de seguir , atribua o anterior
UIViewController
como esta propriedade.4) E conforma-se a um método dentro
MyViewController
doUINavigationControllerDelegate
fonte
No meu caso,
viewWillDisappear
funcionou melhor. Mas, em alguns casos, é preciso modificar o controlador de exibição anterior. Então, aqui está minha solução com acesso ao controlador de exibição anterior e ele funciona no Swift 4 :fonte
Antes de deixar o controlador atual, preciso mostrar alerta. Então eu fiz assim:
UINavigationController
comUINavigationBarDelegate
Funcionou)
fonte
Não é difícil como pensamos. Basta criar um quadro para o UIButton com cor de fundo clara, atribuir ação ao botão e colocar sobre o botão Voltar da barra de navegação. E, finalmente, remova o botão após o uso.
Aqui está o código de exemplo do Swift 3 feito com UIImage em vez de UIButton
escreva o código precisa ser executado
Remova o subView após a execução da ação
fonte
Swift 4.2:
fonte
Swift 3:
fonte
Tente isso.
Tente isso também.
fonte
basta controlar + arraste o item da barra para abaixo da função. trabalhar como charme
fonte
Você pode subclassear
UINavigationController
e substituirpopViewController(animated: Bool)
. Além de poder executar algum código lá, você também pode impedir que o usuário volte completamente, por exemplo, para solicitar salvar ou descartar seu trabalho atual.Exemplo de implementação em que você pode definir um
popHandler
que seja definido / limpo por controladores enviados.E experimente o uso de um controlador enviado que rastreia o trabalho não salvo.
Como um toque agradável, isso também será chamado
interactivePopGestureRecognizer
quando o usuário tentar voltar usando um gesto de furto.fonte
Esta é a minha solução
No seu controlador de exibição, você pode lidar assim:
fonte
Como eu entendo que você quer esvaziar a
array
medida que você pressiona o botão Voltar e pop para o seu anteriorViewController let
oArray
que você carregou na tela éfonte
fonte
fonte
Para o Swift 5 , podemos ver como isso desaparece
fonte
Swift 5 __ Xcode 11.5
No meu caso, eu queria fazer uma animação e, quando terminar, voltasse. Uma maneira de substituir a ação padrão do botão voltar e chamar sua ação personalizada é:
Ou você pode usar esse método uma vez para explorar a hierarquia da visualização NavigationBar e obter os índices para acessar a visualização _UIButtonBarButton, transmitir para UIControl, remover a ação-alvo e adicionar suas ações-alvo personalizadas:
fonte
Eu consegui isso chamando / substituindo
viewWillDisappear
e acessando a pilhanavigationController
assim:fonte
Foi assim que resolvi para o meu próprio problema
fonte
Aqui está a solução Swift 5 mais simples possível, que não exige que você crie um botão voltar personalizado e desista de toda a funcionalidade do botão esquerdo do UINavigationController que você obtém gratuitamente.
Como Brandon A recomenda acima, você precisa implementar
UINavigationControllerDelegate
no controlador de exibição com o qual deseja interagir antes de retornar a ele. Uma boa maneira é criar uma sequência de desenrolamento que você pode executar manualmente ou automaticamente e reutilizar o mesmo código a partir de um botão personalizado ou do botão Voltar.Primeiro, torne seu controlador de exibição de interesse (aquele que você deseja detectar retornando) um delegado do controlador de navegação
viewDidLoad
:Segundo, adicione uma extensão na parte inferior do arquivo que substitua
navigationController(willShow:animated:)
Como sua pergunta incluía a
UITableViewController
, incluí uma maneira de obter o caminho do índice da linha que o usuário digitou.fonte
Você pode fazer algo no seu Viewcontroller como
Para uma resposta completa, use Detectar quando o botão 'voltar' é pressionado na barra de navegação
fonte