Hoe programmatisch Unwind-segue uitvoeren?

Met storyboard is dit heel eenvoudig. Je sleept de actie gewoon naar “Afsluiten”. Maar hoe moet ik het aanroepen vanuit mijn code?


Antwoord 1, autoriteit 100%

  1. Maak een handmatige segue (ctrl-sleep van de eigenaar van het bestand naar Exit),
  2. Kies het in het linkerbedieningsmenu onder de groene EXIT-knop.

Voer de naam van Segue in om te ontspannen.

Vervolgens,- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender.met uw segue-identificatie.


Antwoord 2, autoriteit 60%

Hier is een compleet antwoord met Objective C en Swift:

1) Maak een IBActionafwikkelsegment in uw bestemmingsweergavecontroller (waar u naartoe wilt gaan). Overal in het implementatiebestand.

// Objective C
    - (IBAction)unwindToContainerVC:(UIStoryboardSegue *)segue {
    }
// Swift
 @IBAction func unwindToContainerVC(segue: UIStoryboardSegue) {
    }

2) Op de bronweergavecontroller (de controller waar u vandaan komt), ⌃ + sleep van “Naam van activiteit” om af te sluiten. U zou de in stap 1 gemaakte ontspanningsreeks in de pop-up moeten zien. (Als je het niet ziet, bekijk dan stap één). Kies afwikkelToContainerVC: uit de pop-up, of hoe je ook je methode hebt genoemd om je broncontroller te verbinden met de afwikkel-IBAction.

3) Selecteer de segue in de documentoverzicht van het storyboard van de bronweergavecontroller (deze wordt onderaan weergegeven) en geef het een identificatie.

4) Roep de afwikkel-segue aan met deze methode van de bronview-controller, en vervang de naam van de afwikkel-segue.

// Doelstelling C

[self performSegueWithIdentifier:@"unwindToContainerVC" sender:self];

// Snel

self.performSegueWithIdentifier("unwindToContainerVC", sender: self)

NB. Gebruik de eigenschap sourceViewController van de segue-parameter op de afwikkelmethode om toegang te krijgen tot alle blootgestelde eigenschappen op de broncontroller. Merk ook op dat het framework het afwijzen van de broncontroller afhandelt. Als je dit wilt bevestigen, voeg dan een dealloc-methode toe aan de broncontroller met een logbericht dat moet worden geactiveerd zodra het is uitgeschakeld. Als dealloc niet werkt, heb je mogelijk een bewaarcyclus.


Antwoord 3, autoriteit 30%

bradleygriffith‘s antwoord was geweldig. Ik nam stap 10 en maakte een screenshot ter vereenvoudiging. Dit is een screenshot in Xcode 6.

  1. Sleep de Ctrl-toets van het oranje pictogram naar het rode pictogram Afsluiten om een ​​ontspanning te creëren zonder acties/knoppen in de weergave.

  1. Selecteer vervolgens het unwind seguein de zijbalk:

  1. Stel een Segue-identificatietekenreeks in:

  1. Toegang tot die identifier via code:
[self performSegueWithIdentifier:@"unwindIdentifier" sender:self];

Antwoord 4, autoriteit 5%

Ik heb [self dismissViewControllerAnimated: YES completion: nil];gebruikt waarmee u terugkeert naar de aanroepende ViewController.


Antwoord 5, autoriteit 4%

Citeertekst uit Apple’s technische opmerking over Unwind Segue:
Om een ​​afwikkeltraject toe te voegen dat alleen programmatisch wordt geactiveerd, houdt u Ctrl+sleep van het weergavecontrollerpictogram van de scène naar het afsluitpictogram en selecteert u vervolgens een afwikkelactie voor het nieuwe segment in het pop-upmenu.

Link naar technische opmerking


Antwoord 6, autoriteit 2%

Het antwoord van Vishal Chaudhry hierboven werkte voor mij. Ik zou dat ook toevoegen om het vervolg handmatig te activeren met:

[self performSegueWithIdentifier:@"mySegueName" sender:self];

vanuit de ViewController moet u ook het afwikkelsegment selecteren onder de ViewController’s Scene in het storyboard en in de eigenschappenweergave op de RHS ervoor zorgen dat het veld Indentifier de namer bevat waarnaar u verwijst in de code (“mySegueName” in het voorbeeld hierboven).

Als u deze stap overslaat, genereert de regel hierboven een uitzondering waarvan de sequenaam niet bekend is.


Antwoord 7

Achterwaarts compatibele oplossing die werkt voor versies vóór ios6, voor geïnteresseerden:

- (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;
        }
    }
}

Antwoord 8

SWIFT 4:

1.Maak een @IBActionmet een segue in de controller die je wilt ontspannen om:

   @IBAction func unwindToVC(segue: UIStoryboardSegue) {
    }

2.In het storyboard, vanaf de controller die u wilt scheiden (afwikkelen) van ctrl+sleep vanaf het controller-teken naar het exit-teken en kies de methode die u eerder hebt gemaakt:

3.Nu kun je zien dat je in documentoverzicht een nieuwe regel hebt met de titel “Ontwikkel segue…”. Nu moet u op deze regel klikken en attributeninspecteur openen om de identifier in te stellen (in mijn geval unwindSegueIdentifier).

4.Je bent bijna klaar! Nu moet je de view-controller openen waarvan je wilt ontspannen en een methode maken die segue uitvoert. U kunt bijvoorbeeld een knop toevoegen, deze verbinden met code met @IBAction, daarna binnen deze IBActionperfromSegue(withIdentifier:sender:)methode toevoegen :

    @IBAction func unwindToSomeVCWithSegue(_ sender: UIButton) {
         performSegue(withIdentifier: "unwindSegueIdentifier", sender: nil)
     }

Dus dat is alles wat je hoeft te doen!


Antwoord 9

Swift 4.2, Xcode 10+

Voor degenen die zich afvragen hoe dit te doen met VC’s niet ingesteld via het storyboard(degenen die op deze vraag komen door “programmatisch” + “ontspan segue” te zoeken).

Gezien het feit dat u een afrolprogramma niet programmatisch kunt instellen, is de eenvoudigste, uitsluitend programmatische oplossing om te bellen:

navigationController?.popToRootViewController(animated: true)

waardoor alle weergavecontrollers op de stapel terug naar je rootweergavecontroller worden gegooid.


Als u alleen de bovenste weergavecontroller uit de navigatiestapel wilt halen, gebruikt u:

navigationController?.popViewController(animated: true)


Antwoord 10

Ter info: om ervoor te zorgen dat het antwoord van @Vadim werkt met een handmatige afwikkelingsactie die vanuit een View Controller wordt aangeroepen, moet u het volgende commando plaatsen:

[self performSegueWithIdentifier:(NSString*) identifier sender:(id) sender];

binnen de overschreven klassenmethode viewDidAppearzoals zo:

-(void) viewDidAppear:(BOOL) animated
{
    [super viewDidAppear: animated];
    [self performSegueWithIdentifier:@"SomeSegueIdentifier" sender:self];
}

Als je het in andere ViewController-methoden plaatst, zoals viewDidLoadof viewWillAppear, wordt het genegeerd.

Other episodes