Usando o storyboard, isso é muito fácil. Você apenas arrasta a ação para "Sair". Mas como devo chamá-lo do meu código?
Usando o storyboard, isso é muito fácil. Você apenas arrasta a ação para "Sair". Mas como devo chamá-lo do meu código?
Respostas:
Insira o Nome do Segue para relaxar.
Então, - (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.
com o seu segue, identifique-se.
Aqui está uma resposta completa com o Objetivo C e Swift:
1) Crie um IBAction
segue de desenrolamento no seu controlador de exibição de destino (para onde você deseja seguir). Em qualquer lugar do arquivo de implementação.
// Objective C
- (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
}
// Swift
@IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
}
2) No controlador de exibição de origem (o controlador do qual você está seguindo), drag + arraste de "Nome da atividade" para sair. Você deve ver as instruções desenroladas criadas na etapa 1 no pop-up. (Caso não o veja, revise a etapa um). Escolha unwindToContainerVC: no pop-up ou qualquer que seja o nome do seu método para conectar seu controlador de origem ao IBAction.
3) Selecione as instruções no esboço do documento do controlador de exibição de origem do storyboard (ele será listado na parte inferior) e dê um identificador .
4) Chame o segue de desenrolamento usando este método no controlador de exibição de origem , substituindo seu nome de segue de desenrolamento.
// objetivo C
[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];
// Rápido
self.performSegueWithIdentifier("unwindToContainerVC", sender: self)
NB. Use a propriedade sourceViewController do parâmetro segue no método desenrolar para acessar quaisquer propriedades expostas no controlador de origem. Além disso, observe que a estrutura lida com a dispensa do controlador de origem. Se você deseja confirmar isso, adicione um método de desalocação ao controlador de origem com uma mensagem de log que deve ser disparada após a morte. Se o dealloc não disparar, você poderá ter um ciclo de retenção.
(IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue
ctrl+drag
de ViewController
para Exit
foi incrivelmente útil. Obrigado!
bradleygriffith
A resposta foi ótima. Eu dei o passo 10 e fiz uma captura de tela para simplificação. Esta é uma captura de tela no Xcode 6.
unwind segue
na barra lateral:[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];
UIViewController
. Então sua solução irá funcionar #
Eu usei o [self dismissViewControllerAnimated: YES completion: nil];
que o levará de volta ao chamado ViewController
.
Citando texto da Nota técnica da Apple sobre Desdobrar segmento: Para adicionar uma sequência de desenrolamento que só será acionada de forma programática, mantenha pressionada a tecla Ctrl + arraste do ícone do controlador de exibição da cena para o ícone de saída e, em seguida, selecione uma ação de desenrolar para a nova sequência no menu pop-up.
A resposta de Vishal Chaudhry acima funcionou para mim. Eu também adicionaria isso para acionar manualmente o seque usando:
[self performSegueWithIdentifier:@"mySegueName" sender:self];
a partir do ViewController, você também deve selecionar as etapas de desenrolamento na Cena do ViewController no storyboard e na visualização de propriedades no RHS, para garantir que o campo Identificador contenha o nome que você está se referindo no código ("mySegueName" no exemplo acima )
Se você omitir esta etapa, a linha acima emitirá uma exceção que o nome do seque não é conhecido.
Solução compatível com versões anteriores que funcionará para versões anteriores ao ios6, para os interessados:
- (void)unwindToViewControllerOfClass:(Class)vcClass animated:(BOOL)animated {
for (int i=self.navigationController.viewControllers.count - 1; i >= 0; i--) {
UIViewController *vc = [self.navigationController.viewControllers objectAtIndex:i];
if ([vc isKindOfClass:vcClass]) {
[self.navigationController popToViewController:vc animated:animated];
return;
}
}
}
SWIFT 4 :
1. Crie uma @IBAction com segue dentro do controlador que você deseja descontrair:
@IBAction func unwindToVC(segue: UIStoryboardSegue) {
}
2. No storyboard, no controlador que você deseja seguir (desenrolar) de ctrl + arraste do sinal do controlador para sair do sinal e escolha o método que você criou anteriormente:
3. Agora você pode notar que, no esboço do documento, você tem uma nova linha com o título "Desenrolar segue ....". Agora você deve clicar nesta linha e abrir o inspetor de atributos para definir o identificador (no meu caso, descontrairSegueIdentifier ).
4. Você está quase pronto! Agora você precisa abrir o controlador de exibição do qual deseja relaxar e criar algum método que execute o seguinte. Por exemplo, você pode adicionar o botão, conectá-lo ao código com @IBAction , depois dentro deste IBAction adicione o método perfromSegue (withIdentifier: sender :) :
@IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
}
Então é isso que você precisa fazer!
Para aqueles que se perguntam como fazer isso com os VCs não configurados pelo storyboard (aqueles que chegam a essa pergunta pesquisando "programaticamente" + "desenrolar segue").
Como você não pode configurar um desenrolar segue programaticamente, a solução programática mais simples é chamar:
navigationController?.popToRootViewController(animated: true)
que exibirá todos os controladores de exibição na pilha de volta ao seu controlador de exibição raiz.
Para exibir apenas o controlador de exibição mais alto da pilha de navegação, use:
navigationController?.popViewController(animated: true)
FYI: Para que a resposta do @ Vadim funcione com uma ação manual de desenrolamento chamada de dentro de um View Controller, você deve colocar o comando:
[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];
dentro do método de classe substituída viewDidAppear assim:
-(void) viewDidAppear:(BOOL) animated
{
[super viewDidAppear: animated];
[self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}
Se você colocá-lo em outros métodos ViewController, como viewDidLoad ou viewWillAppear, ele será ignorado.
performSegueWithIdentfier
faz exatamente isso: realizar o segue de um ViewController para outro