2016-03-24 2 views
1

Я хочу создать что-то похожее на страницу done/edit для приложения Contacts. Кажется, что есть изменение в взгляде за модальным видом, однако я не уверен, как это порождает такое поведение.Изменение контроллеров просмотра за контроллером Modal View

Вот что я смотрел до сих пор:

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

Вот что я хочу сделать:

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

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

я могу сделать VC2 показать на вершине VC1 модально. Но когда кнопка «done» нажата на vc2, она возвращается к vc1 вместо перехода на vc3, а затем, когда нажата «назад», переходит в vc1.

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

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

Любая помощь была бы высоко оценена! Большое вам спасибо за ваше время :)

ответ

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) 
    } 
} 
+0

Извиняюсь за поздний ответ супер. Но большое вам спасибо за то, что нашли время, чтобы ответить на мой вопрос. В чем смысл этой строки кода '_vc2.delegate = self'? – aejhyun

+0

Я понимаю значение этого кода. Большое вам спасибо за то, что нашли время, чтобы ответить на мой вопрос. Это решило мою проблему :) – aejhyun

+0

Ваше решение не работает. Контроллер за модальным не заменен – Codenator81

Смежные вопросы