Отклонить второй ViewController из третьего ViewController

Я пытаюсь отклонить VC b от VC c, где VC c является всплывающим окном и имеет кнопку для выхода, но она не работает. Структура потока

VC a ----presents modally----> VC b ----presents a popover----> VC c

Когда кнопка во всплывающем окне нажата, VC c и VC b должны быть закрыты, чтобы вызвать (VC a)ViewWillAppear.


person bakhtiar masood    schedule 14.07.2017    source источник
comment
Покажите код, который вы пробовали   -  person Paulw11    schedule 14.07.2017
comment
я пробовал это, но это не работает: self.presentingViewController?.presentingViewController?.dismiss(анимация: правда, завершение: ноль)   -  person bakhtiar masood    schedule 14.07.2017
comment
Не могли бы вы поделиться кодом, представляющим VC a   -  person Manikanta Chintapalli    schedule 14.07.2017
comment
Убедитесь, что вы видите этот вопрос. Это Objective-C, но есть отличный подробный ответ. Также см. здесь   -  person Honey    schedule 14.07.2017


Ответы (5)


Попробуйте это:

Вы можете отклонить свой presentingViewController из контроллера дочернего представления, как показано ниже.

self.presentingViewController?.dismiss(animated: true, completion: nil)

Когда вы добавляете ViewController в качестве childViewController

self.parent?.dismiss(animated: true, completion: nil) 

Если этот контроллер представления является дочерним элементом содержащего контроллера представления (например, контроллера навигации или контроллера панели вкладок),

weak open var parent: UIViewController? { get }

Контроллер представления, который был представлен этим контроллером представления или его ближайшим предком.

open var presentedViewController: UIViewController? { get }

Контроллер представления, который представил этот контроллер представления (или его самый дальний предок).

open var presentingViewController: UIViewController? { get }
person Harshal Valanda    schedule 14.07.2017
comment
Как представить vc B в vc C, предоставить это - person Harshal Valanda; 14.07.2017
comment
Предоставляет дополнительную информацию, например, как представить ваш vc C из vc B. - person Harshal Valanda; 14.07.2017
comment
я вызвал переход раскадровки, который будет выполняться в VC b как PerformSegue(withIdentifier: pop, sender: self) в ibaction. этот переход представляет VC может всплывающее окно - person bakhtiar masood; 14.07.2017
comment
как я могу назначить родительское значение VC, потому что это свойство только для получения. - person bakhtiar masood; 14.07.2017
comment
проверить обновленный ответ `self.presentingViewController?.dismiss (анимация: правда, завершение: ноль) ` - person Harshal Valanda; 14.07.2017

Если ViewControllers имеет иерархию, например

VC a ----представлен как self.present(objects, animated: true, completion: nil) модально----> VC b ---- представлен как self.present(objects, animated: true, completion: nil) popover----> VC c

И есть кнопка на VC c, чтобы вернуться к VC a, тогда вы можете использовать:

self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)
person Nikhlesh Bagdiya    schedule 14.07.2017
comment
не работает я пробовал тысячи раз - person bakhtiar masood; 14.07.2017
comment
Каков результат, что происходит? - person Oleg Danu; 14.07.2017
comment
Не могли бы вы показать свой код, который показывает, как вы представляете VC b и VC c - person Nikhlesh Bagdiya; 14.07.2017
comment
VC b отображается как PerformSegue(withIdentifier: вознаграждения, отправитель: nil), а VC c отображается как PerformSegue(withIdentifier: pop, sender: self) - person bakhtiar masood; 14.07.2017
comment
пожалуйста, проверьте, вызывается кнопка @IBAction или нет. - person Nikhlesh Bagdiya; 14.07.2017

Прежде всего попробуйте отключить VC b от самого себя, не предъявляя VC c просто для проверки его работы, используя: self.dismiss(animated: true, completion: nil) или если VC b встроен в навигационный контроллер, вот так: self.navigationController?.dismiss(animated: true, completion: nil)

Если тот, что описан выше, работает, я бы предложил вам реализовать протокол делегирования, в котором VC будет делегировать VC b увольнение, когда бы это ни было необходимо. Вы также можете использовать для этого блок завершения, содержащий код dismiss.

person Oleg Danu    schedule 14.07.2017
comment
но VC c не охватывает текущий контекст, на самом деле это всплывающее окно, поэтому, если пользователь не нажимает на всплывающее окно, а где-то еще, всплывающее окно, которое является VC c, исчезнет, ​​но под ним не будет отображаться VC b, который будет отображаться противоречить течению - person bakhtiar masood; 14.07.2017

Надеюсь, это работает

// Call inside View controller C    
        self.presentingViewController?.dismissViewControllerAnimated(false, completion: nil)
        self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)
person Vignesh Davins    schedule 14.07.2017

Как насчет Presenter или Coordinator.

Этот экземпляр будет инициализировать все эти VC, а также представлять их. Оттуда вы также можете отклонить их.

person Ugo Arangino    schedule 02.09.2018