2016-03-02 2 views
0

Я представляю учебник 4 UIViewController, когда мое приложение запускается в первый раз. У каждого UIViewController есть кнопка с segue, представляющая следующий ViewController. Последний ViewController имеет кнопку «Давайте начнем», которая должна полностью убрать учебник.Использование rejectViewController в очереди нескольких UIViewControllers с делегатом

Задача: Это отклоняет все ViewControllers, кроме первого. Я не понимаю, почему ?!

Что я ожидаю:

На последнем ViewController4 я звоню функцию dismissIntroduction() первого ViewController, так что я, кроме ВСЕХ ViewControllers (ViewController1 включены) должны исчезнуть. Когда я нажимаю кнопку на первом ViewController и вызываю функцию "rejectIntroduction()", она исчезает.

ViewController 1 (WelcomeViewController):

protocol WelcomeViewDelegate { 
    func dismissIntroduction() 
} 

class WelcomeViewController: UIViewController, WelcomeViewDelegate { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Do any additional setup after loading the view. 
    } 

    func dismissIntroduction() { 
     self.dismissViewControllerAnimated(true, completion: nil) 
    } 


    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let destination = segue.destinationViewController as! ViewController2 
     destination.delegate = self 
    } 

} 

ViewController 2:

class ViewController2: UIViewController { 

    var delegate:WelcomeViewDelegate? 

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

    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let destination = segue.destinationViewController as! ViewController3 
     destination.delegate = self.delegate 
    } 

} 

ViewController 3:

class ViewController3: UIViewController { 

    var delegate:WelcomeViewDelegate? 

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

    // MARK: - Navigation 

    // In a storyboard-based application, you will often want to do a little preparation before navigation 
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
     let destination = segue.destinationViewController as! ViewController4 
     destination.delegate = self.delegate 
    } 

} 

ViewController4 (последний):

class ViewController4: UIViewController { 

    var delegate:WelcomeViewDelegate? 

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

    @IBAction func pressLetsStart(sender: AnyObject) { 
     self.delegate!.dismissIntroduction() 
    } 

} 

EDIT: Я получил это работает, когда я ставлю функция dismissViewControllerAnimated два раза !?

func dismissIntroduction() { 
    self.dismissViewControllerAnimated(true, completion: nil) 
    self.dismissViewControllerAnimated(true, completion: nil) 
} 

Но почему? Я не понимаю логики ...

+0

Пробовали ли вы имея это все четыре контроллера в навигационном контроллере и настоящий NavController из скажем PPViewContoller? – mkumar

+0

Я не хочу помещать его в контроллер навигации (из-за навигационной панели). –

+1

вы всегда можете скрыть навигационную панель, как в http://stackoverflow.com/questions/2926914/navigation-bar-show-hide, делая по-яблочному пути (контроллер навигации) - это лучший подход, чем использование многих ошибок или служебной кобылы в долгосрочной перспективе .. – mkumar

ответ

0

Я решил проблему с помощью следующих функций в последней ViewController:

@IBAction func pressLetsStart(sender: AnyObject) { 
    self.dismissModalStack() 
} 

private func dismissModalStack() { 
    var vc = self.presentingViewController! as UIViewController 
    while (vc.presentingViewController != nil) { 
     vc = vc.presentingViewController!; 
    } 
    vc.dismissViewControllerAnimated(true, completion: nil) 
} 
Смежные вопросы