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