2015-06-22 5 views
5

Rückkehr Ich habe einen optionalen bool Variable showSettings auf meinen ersten View-Controller genannt, die ViewController genannt wird, und ich bin knallend aus SecondViewController zurück zu ViewController.Swift - Mit popViewController und Übergabe von Daten an die Viewcontroller sind Sie auf

Bevor ich platze, möchte ich das Bool auf True setzen. Scheint falsch, einen anderen View-Controller zu instanziieren, da sich ViewController im Speicher befindet.

Was ist der beste Weg, dies zu tun? Ich verwende keine Storyboards, wenn dies für Ihre Antwort wichtig ist.

Danke für Ihre Hilfe

+0

die Antwort, die Sie suchen, ist zu diesem Beitrag [es möglich, Pass-Daten mit popViewControllerAnimated?] [ 1] [1]: http://stackoverflow.com/questions/13509832/it-possible-to-pass-data-with-popviewcontrolleranimated –

Antwort

13

Also habe ich es aus, basiert vor allem von diesem Posten - http://makeapppie.com/2014/09/15/swift-swift-programmatic-navigation-view-controllers-in-swift/

In SecondViewController vor der Klassendeklaration, fügen Sie diesen Code:

protocol SecondVCDelegate { 
    func didFinishSecondVC(controller: SecondViewController) 
} 

innen Dann von SecondViewContoller fügen Sie eine Klassenvariable hinzu:

var delegate: MeditationVCDelegate! = nil

dann innerhalb Ihrer Funktion, die Ihre Schaltfläche Ziele, fügen Sie diese:

self.navigationController?.popViewControllerAnimated(true) 
delegate.didFinishSecondVC(self) 

Was wir hier tun, in SecondViewController das Pop tut, und nicht keine Daten vorbei, aber da wir haben ein Protokoll definiert, verwenden wir das in ViewController, um die Daten zu behandeln.

Also die nächsten, in ViewController, fügen Sie das Protokoll, das Sie in SecondViewController in der Liste der Klassen definieren ViewController Erben von

class ViewController: UIViewController, SecondVCDelegate { ... your code... } 

Sie finden die Funktion hinzufügen müssen wir in dem neuen Protokoll definiert, um mach den Compiler glücklich. Innerhalb von ViewController ‚s Klasse, fügen Sie diese:

func didFinishSecondVC(controller: SecondViewController) { 
    self.myBoolVar = true 
    controller.navigationController?.popViewControllerAnimated(true) 
} 

In SecondViewController wo wir didFinishSecondVC anrufen, sind wir diese Methode in der ViewController Klasse aufrufen, die Steuerung auf den wir knallen. Es ist ähnlich, wenn wir diesen Code innerhalb von SecondViewController geschrieben haben, aber wir haben ihn in ViewController geschrieben und verwenden einen Delegaten, um die Nachrichten zwischen den beiden zu verwalten.

schließlich in ViewController, in der Funktion Push-SecondViewController wir Targeting, fügen Sie diesen Code:

let secondVC = secondViewController() 
secondVC.delegate = self 
self.navigationController?.pushViewController(secondVC, animated: true) 

Das ist es! Sie sollten alle darauf eingestellt sein, Code zwischen zwei View-Controllern zu übergeben, ohne Storyboards zu verwenden!

+0

ich glaube, 'var Delegat: MeditationVCDelegate! = nil' sollte 'var delegate: SecondVCDelegate sein! = nil', oder? – oelna

+1

Schöne Lösung! Danke Zack! – Cristina

0

Ich stieß auf diese Suche nach einer Möglichkeit, es zu tun. Da ich Storyboards häufiger verwende, habe ich festgestellt, dass ich das Array von Controllern im Navigationsstapel bekommen kann, das eine direkt vor dem aktuellen, das oben ist, überprüfe, ob es mein Delegierter ist, und wenn ja, werfe es als delegiere, setze meine Methoden, dann öffne mich vom Stapel.Obwohl der Code in ObjC ist, sollte es leicht zu schnellen übersetzbar sein:

// we need to get the previous view controller 
NSArray *array = self.navigationController.viewControllers; 
if (array.count > 1) { 
    UIViewController *controller = [array objectAtIndex:(array.count - 2)]; 
    if ([controller conformsToProtocol:@protocol(GenreSelectionDelegate)]) { 
     id<GenreSelectionDelegate> genreDelegate = (id<GenreSelectionDelegate>)controller; 
     [genreDelegate setGenre:_selectedGenre]; 
    } 
    [self.navigationController popViewControllerAnimated:YES]; 
} 
8
_ = self.navigationController?.popViewController(animated: true) 
     let previousViewController = self.navigationController?.viewControllers.last as! PreviousViewController 
     previousViewController.PropertyOrMethod 
+0

Das funktionierte für mich danke dir –

Verwandte Themen