Em poucas palavras
Um segue de desenrolamento (às vezes chamado de segue de saída ) pode ser usado para navegar de volta através de seguimentos push, modal ou popover (como se você tivesse retirado o item de navegação da barra de navegação, fechou o popover ou dispensou o controlador de exibição apresentado modalmente). Além disso, você pode realmente relaxar não apenas uma, mas uma série de seguimentos push / modal / popover, por exemplo, "voltar" várias etapas na hierarquia de navegação com uma única ação de relaxamento.
Ao executar uma sequência de desenrolamento, é necessário especificar uma ação, que é um método de ação do controlador de exibição em que você deseja descontrair.
Objetivo-C:
- (IBAction)unwindToThisViewController:(UIStoryboardSegue *)unwindSegue
{
}
Rápido:
@IBAction func unwindToThisViewController(segue: UIStoryboardSegue) {
}
O nome desse método de ação é usado quando você cria as etapas de desenrolamento no storyboard. Além disso, esse método é chamado pouco antes da execução do desenrolamento. Você pode fazer com que o controlador de visualização de origem, a partir do UIStoryboardSegue
parâmetro passado, interaja com o controlador de visualização que iniciou o segue (por exemplo, para obter os valores de propriedade de um controlador de visualização modal). A este respeito, o método tem uma função semelhante ao prepareForSegue:
método de UIViewController
.
Atualização do iOS 8: os desenrolamentos de desenrolamento também funcionam com os adaptativos do iOS 8, como Mostrar e Mostrar detalhes .
Um exemplo
Vamos criar um storyboard com um controlador de navegação e três controladores de exibição filho:
No Green View Controller, você pode relaxar (navegar de volta) para o Red View Controller. Do azul, você pode relaxar para verde ou vermelho via verde. Para ativar o desenrolamento, você deve adicionar os métodos de ação especiais a Vermelho e Verde, por exemplo, aqui está o método de ação em Vermelho:
Objetivo-C:
@implementation RedViewController
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
}
@end
Rápido:
@IBAction func unwindToRed(segue: UIStoryboardSegue) {
}
Após a adição do método de ação, você pode definir as etapas de desenrolamento no storyboard arrastando a tecla Control até o ícone Sair. Aqui, queremos desanuviar do vermelho para o verde quando o botão é pressionado:
Você deve selecionar a ação que é definida no controlador de exibição que deseja descontrair:
Você também pode relaxar com o Red from Blue (que fica a "dois passos" na pilha de navegação). A chave é selecionar a ação de desenrolar correta.
Antes da execução do desenrolamento, o método de ação é chamado. No exemplo, eu defini um desenrolar segue para vermelho de verde e azul. Podemos acessar a fonte do desenrolar no método de ação através do parâmetro UIStoryboardSegue:
Objetivo-C:
- (IBAction)unwindToRed:(UIStoryboardSegue *)unwindSegue
{
UIViewController* sourceViewController = unwindSegue.sourceViewController;
if ([sourceViewController isKindOfClass:[BlueViewController class]])
{
NSLog(@"Coming from BLUE!");
}
else if ([sourceViewController isKindOfClass:[GreenViewController class]])
{
NSLog(@"Coming from GREEN!");
}
}
Rápido:
@IBAction func unwindToRed(unwindSegue: UIStoryboardSegue) {
if let blueViewController = unwindSegue.sourceViewController as? BlueViewController {
println("Coming from BLUE")
}
else if let redViewController = unwindSegue.sourceViewController as? RedViewController {
println("Coming from RED")
}
}
Desenrolar também funciona através de uma combinação de push / modal segues. Por exemplo, se eu adicionasse outro controlador de exibição Yellow com um segue modal, poderíamos relaxar do Yellow até o Red em uma única etapa:
Desenrolando do Código
Quando você define um segue de desenrolar ao arrastar algo para o símbolo Exit de um controlador de exibição, um novo segue aparece no Esboço do documento:
Selecionar as instruções e ir para o Inspetor de atributos revela a propriedade "Identificador". Use isso para fornecer um identificador exclusivo para seus seguimentos:
Depois disso, os passos descontraídos podem ser executados a partir do código, como qualquer outro segue:
Objetivo-C:
[self performSegueWithIdentifier:@"UnwindToRedSegueID" sender:self];
Rápido:
performSegueWithIdentifier("UnwindToRedSegueID", sender: self)
dismissViewControllerAnimated:completion:
oupopViewControllerAnimated:
alcançar a mesma coisa?dismissViewControllerAnimated:completion:
oupopViewControllerAnimated:
é que o método que você adicionou ao controlador de exibição para o qual você está desenrolando é chamado e, assim, você tem uma maneira fácil de saber que o controlador de exibição apresentado foi concluído sem precisar fazer do controlador de exibição apresentador um delegado do controlador de exibição apresentado .No que diz respeito a como usar desenroladores seguidos no StoryBoard ...
Passo 1)
Vá para o código do controlador de exibição que você deseja descontrair e adicione isto:
Objetivo-C
Certifique-se de também declarar esse método no seu arquivo .h no Obj-C
Rápido
Passo 2)
No storyboard, acesse a visualização da qual deseja relaxar e simplesmente arraste uma sequência do seu botão ou o que quer que seja até o pequeno ícone laranja "EXIT" no canto superior direito da visualização de origem.
Agora deve haver uma opção para se conectar a "- unwindToViewControllerNameHere"
É isso aí, seus passos serão desenrolados quando o botão for pressionado.
fonte
Os desenrolamentos de desenrolamento são usados para "voltar" a algum controlador de exibição do qual, através de várias etapas, você chegou ao controlador de exibição "atual".
Imagine que você tem algo um
MyNavController
comA
como seu controlador de vista raiz. Agora você usa um push segue paraB
. Agora o controlador de navegação possui A e B em suaviewControllers
matriz, e B está visível. Agora você apresentaC
modalmente.Com os desenrolamentos seguidos, agora você pode retroceder "voltar" de
C
paraB
(ou seja, descartar o controlador de exibição apresentado modalmente), basicamente "desfazendo" o segue modal. Você pode até voltar ao controlador de visualização raizA
, desfazendo o segue modal e o push segue.Desenrolar os passos facilita o retorno. Por exemplo, antes do iOS 6, a melhor prática para descartar os controladores de exibição apresentados era definir o controlador de exibição de apresentação como delegado do controlador de exibição apresentado e, em seguida, chamar seu método delegado personalizado, que dispensa o apresentadoViewController . Parece complicado e complicado? Isso foi. É por isso que descontrair segues é bom.
fonte
dismissViewController:animated
do controlador apresentado. Você não precisa delegar isso. Obviamente, se você precisar transmitir dados, precisará de delegação ou outro método.dismissViewController:animated:
do controlador apresentado, a "melhor prática" era chamar um método delegado no controlador de apresentação para fazer isso por você, como Yang mencionou.Algo que eu não vi mencionado nas outras respostas aqui é como você lida com o desenrolamento quando não sabe onde a sequência inicial se originou, o que para mim é um caso de uso ainda mais importante. Por exemplo, digamos que você tenha uma ajuda para visualizar o controlador ( H ) exibido de forma modal a partir de dois controladores de exibição diferentes ( A e B ):
A → H
B → H
Como você configura as instruções de desenrolamento para voltar ao controlador de exibição correto? A resposta é que você declara uma ação de desenrolamento em A e B com o mesmo nome , por exemplo:
Dessa forma, o desenrolamento encontrará o controlador de visualização ( A ou B ) que iniciou o segue e retornará a ele.
Em outras palavras, pensar a ação desenrola como descrevendo onde o segue está vindo de , ao invés de onde ele está indo.
fonte
IOS rápido:
Etapa 1: defina esse método na visualização do controlador MASTER. em que você deseja voltar:
Etapa 2: (StoryBoard) Clique com o botão direito do mouse no botão SLAVE / CHILD EXIT e selecione "goToSideMenu" Como ação no botão Connect you no qual você clicará para retornar à visualização do controlador MASTER:
Etapa 3: criar e executar ...
fonte
Por exemplo, se você navegar do viewControllerB para o viewControllerA, no delegado viewControllerA abaixo, você será chamado e os dados serão compartilhados.
fonte