Изменение контроллеров представления за контроллером модального представления

Я хочу создать что-то похожее на страницу «Готово / отредактировать» для приложения «Контакты». Кажется, что есть изменение в представлении за модальным представлением, однако я не уверен, как это вызывает такое поведение.

Вот что я изучал до сих пор:

iOS: переключить контроллер представления за текущий контроллер модального представления? Похоже, на этот пост есть правильный ответ. Однако я не уверен, что он имеет в виду под making the root view controller a delegate of the modal view и что это значит под call a delegate method.

Вот чего я хочу добиться:

Представьте себе vc1, встроенный в контроллер навигации. Я нажимаю кнопку на vc1, которая вызывает модальное представление vc2. Когда вы нажимаете «Готово» на vc2, он закрывает модальное представление, vc2, и представляет vc3. Когда вы нажимаете кнопку «Назад» на vc3, она возвращается к vc1.

Вот текущее поведение:

Я могу сделать так, чтобы vc2 показывалась поверх vc1 модально. Но когда кнопка «Готово» нажата на vc2, он просто возвращается к vc1 вместо перехода к vc3, а при нажатии «Назад» переходит к vc1.

Вот что я уже пробовал:

Я попробовал перейти от vc1 к vc3 без анимации, а затем модально перейти к v2. Этот тип работает с чрезвычайно некрасивым переходом и вызывает появление этой Presenting view controllers on detached view controllers is discouraged ошибки. Кроме того, я пробовал разные комбинации unwindToSegue методов, но и этого не мог понять.

Любая помощь приветствуется! Большое вам спасибо за ваше время :)


person aejhyun    schedule 24.03.2016    source источник


Ответы (1)


Вы делаете корневой контроллер представления (vc1) делегатом вашего контроллера модального представления, создав протокол в vc1 и используя его как свойство вашего контроллера модального представления. Когда вы отклоняете модальный контроллер представления, вызовите один из методов делегата. Что-то вроде этого может сработать для вас:

vc1:

protocol Vc1Delegate: class {
    func pushToVc3()
}

class Vc1: UIViewController, Vc1Delegate
{
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Vc2Modal" {
            if let _vc2 = segue.destinationViewController as? Vc2 {
                _vc2.delegate = self
            }
        }
    }

    @IBAction func showVc2Modal() {
        performSegueWithIdentifier("Vc2Modal", sender: nil)
    }

    // MARK: Vc1Delegate

    func pushToVc3() {
        performSegueWithIdentifier("Vc3PushWithoutAnimation", sender: nil)
    }
}

Vc2:

class Vc2: UIViewController
{
    weak var delegate: Vc1Delegate?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func dismiss() {
        delegate?.pushToVc3()
        dismissViewControllerAnimated(true, completion: nil)
    }
}
person Simon    schedule 24.03.2016
comment
Прошу прощения за очень поздний ответ. Но большое спасибо за то, что нашли время ответить на мой вопрос. Что означает эта строка кода _vc2.delegate = self? - person aejhyun; 28.03.2016
comment
Я понимаю значение этого кода. Огромное спасибо, что нашли время ответить на мой вопрос. Это решило мою проблему :) - person aejhyun; 28.03.2016
comment
Ваше решение не работает. Контроллер за модальным окном не поменялся местами - person Codenator81; 22.11.2017