Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在具有委托的多个UIViewController的队列上使用dismissViewController_Ios_Objective C_Swift_Cocoa Touch_Uiviewcontroller - Fatal编程技术网

Ios 在具有委托的多个UIViewController的队列上使用dismissViewController

Ios 在具有委托的多个UIViewController的队列上使用dismissViewController,ios,objective-c,swift,cocoa-touch,uiviewcontroller,Ios,Objective C,Swift,Cocoa Touch,Uiviewcontroller,当我的应用程序第一次启动时,我正在演示4 UIViewController的教程。 每个UIViewController都有一个按钮,带有一个显示下一个ViewController的序列。 最后一个ViewController有一个按钮“让我们开始”,该按钮应完全关闭教程 问题: 它将关闭除第一个之外的所有ViewController。我不明白为什么 我的期望: protocol WelcomeViewDelegate { func dismissIntroduction() } cl

当我的应用程序第一次启动时,我正在演示4 UIViewController的教程。 每个UIViewController都有一个按钮,带有一个显示下一个ViewController的序列。 最后一个ViewController有一个按钮“让我们开始”,该按钮应完全关闭教程

问题: 它将关闭除第一个之外的所有ViewController。我不明白为什么

我的期望:

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
    }

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

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

}
class ViewController4: UIViewController {

    var delegate:WelcomeViewDelegate?

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

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

}
在最后一个ViewController4中,我调用了第一个ViewController的dismissinduction()函数,因此除了所有ViewController(包括ViewController1)之外,我都应该消失。 当我在第一个ViewController上放置一个按钮并调用函数“dismission简介()”时,它消失了

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
    }

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

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

}
class ViewController4: UIViewController {

    var delegate:WelcomeViewDelegate?

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

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

}
视图控制器2:

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
    }

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

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

}
class ViewController4: UIViewController {

    var delegate:WelcomeViewDelegate?

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

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

}
ViewController 3:

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
    }

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

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

}
class ViewController4: UIViewController {

    var delegate:WelcomeViewDelegate?

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

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

}
ViewController4(最后一个):

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
    }

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

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

}
class ViewController4: UIViewController {

    var delegate:WelcomeViewDelegate?

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

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

}
编辑: 当我两次使用dismissViewControllerAnimated函数时,它开始工作了

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

但是为什么呢?我不明白…背后的逻辑。

您正在寻找错误的问题解决方案,您需要做的是寻找放松的环节。浏览本教程:

我现在用上一个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)
}

您是否尝试将这四个控制器都放在导航控制器中,并从PPViewContoller中演示NavController?我不想将其放在导航控制器中(因为导航栏)。您可以始终隐藏导航栏,如中所示,使用apple way(导航控制器)从长远来看,这是一种比遇到许多bug或维护麻烦更好的方法。谢谢mkumar,我会试试这个。这听起来真是一个干净的解决方案