Swift-использование popViewController и передача данных ViewController, к которому вы возвращаетесь

у меня есть необязательный bool переменной называется showSettings на моем первом контроллере вида, который называется ViewController, и я выскакиваю из SecondViewController на ViewController.

прежде чем я поп, я хочу установить bool значение true. Кажется неправильным создавать экземпляр другого контроллера вида с ViewController в память.

как лучше всего это сделать? Я не использую раскадровки, если это важно для вашего ответа.

Спасибо за помощь

3 ответов


поэтому я понял это, основываясь в основном на этом посте – http://makeapppie.com/2014/09/15/swift-swift-programmatic-navigation-view-controllers-in-swift/

на SecondViewController, над объявлением класса добавьте этот код:

protocol SecondVCDelegate {
    func didFinishSecondVC(controller: SecondViewController)
}

внутри SecondViewContoller добавить переменную класса:

var delegate: MeditationVCDelegate! = nil

затем внутри вашей функции, что ваша кнопка цели, добавьте это:

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

что мы делаем здесь делает поп в SecondViewController и не передача любых данных, но поскольку мы определили протокол, мы будем использовать это в ViewController для обработки данных.

далее в ViewController добавить протокол определен в SecondViewController в список классы ViewController наследует от:

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

вам нужно добавить функцию, которую мы определили в новом протоколе, чтобы сделать компилятор счастливым. Внутри ViewControllerкласс, добавьте это:

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

на SecondViewController где мы зовем didFinishSecondVC, мы вызываем этот метод внутри ViewController класс, контроллер мы уезжаем до. Это похоже на то, если мы написали этот код внутри SecondViewController но мы написали это внутри ViewController и мы используем делегат для управления сообщениями между двумя.

наконец, в ViewController, в функции, которую мы нацеливаем на пуш to SecondViewController добавьте следующий код:

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

вот именно! Вы должны быть настроены на передачу кода между двумя просмотр контроллеров без использования раскадровок!


_ = self.navigationController?.popViewController(animated: true)
        let previousViewController = self.navigationController?.viewControllers.last as! PreviousViewController
        previousViewController.PropertyOrMethod

я наткнулся на это, ища способ сделать это. Поскольку я использую раскадровки чаще, я обнаружил, что могу получить массив контроллеров в стеке навигации, получить тот, который непосредственно перед текущим, который находится сверху, проверить, является ли это моим делегатом, и если да, то приведите его в качестве делегата, установите мои методы, а затем вытащите себя из стека. Хотя код находится в ObjC, он должен быть легко переведен на swift:

// 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];
}