有没有办法在Swift中同时解雇两个uiViewControllers?

时间:2016-03-30 14:20:45

标签: ios swift uiviewcontroller segue uistoryboardsegue

在我的swift应用程序中,我有一个带按钮的UIViewController。这个按钮打开了UIViewController的编号2,用户有另一个按钮。当用户按下它时 - 他打开UIViewController编号3.还有一个按钮,当用户按下它时 - 他调用代码:

self.dismissViewControllerAnimated(false, completion: nil)

并且由于它,UIViewController 3号消失,用户看到UIViewController 2号。我的问题是 - 是否还有一种方法可以解除UIViewController的编号2,这样用户可以顺利地从3号回到1号?

现在我创建了一个函数并通过协议调用它:

UIViewController号码2:

protocol HandleYourFullRequest: class {
    func hideContainer()
}


class FullRequest: UIViewController, HandleYourFullRequest{

    func hideContainer(){
       self.dismissViewControllerAnimated(false, completion: nil)
    }

    @IBAction func exitbuttonaction(sender: AnyObject) {
        self.performSegueWithIdentifier("temporarySegue", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "temporarySegue"){


        if let fullRequestDetails = segue.destinationViewController as? YourFullRequest
        {

            fullRequestDetails.delegateRequest = self
        }

    }
    }



}

UIViewController编号3:

class YourFullRequest: UIViewController{

    var delegateRequest:HandleYourFullRequest?

    @IBAction func exitbuttonaction(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)

        delegateRequest?.hideContainer()
    }
}

但是当用户按下按钮时,使用该解决方案 - UIViewController编号3消失,UIViewController编号2出现一秒钟然后消失。有没有一种方法可以删除2号而不向用户显示它并直接指向数字1?

4 个答案:

答案 0 :(得分:2)

我仍然不清楚两个按钮连接到哪个动作,但是从我在视图控制器3上按下解除按钮时可以看出它在视图控制器编号2中调用self.dismissViewControllerAnimated(false, completion: nil)

尝试将此方法放在视图控制器3中。

@IBAction func exitButtonAction(sender: AnyObject) {
    self.presentingViewController?.presentingViewController?.dismissViewControllerAnimated(true, completion: nil);
}

这将假设两个视图控制器都被呈现而不是像导航控制器那样被推送。

答案 1 :(得分:0)

您可以使用popToViewController(viewController: UIViewController, animated: Bool)

viewController是你希望弹出的viewController,在你的情况下,'UIViewController number 1'。

popToViewController Documentation

如果您没有对View Controller的引用,可以从self.navigationController.viewControllers获取它,它将是您示例中的第一个对象。

答案 2 :(得分:0)

UINavigationController上有一个名为setViewControllers的方法。它需要一个您想要活动的所有视图控制器的数组。您可以将堆栈上的所有视图控制器作为数组获取,删除不需要的视图控制器,然后使用更新的数组调用setViewControllers。

答案 3 :(得分:0)

您可以使用removeLast()函数将控制器弹出堆栈。

@IBAction func doneAction(sender: AnyObject) {
    var vc = self.navigationController?.viewControllers
    // remove controllers from the stack
    vc?.removeLast()
    vc?.removeLast()
    // Jump back to the controller you want.
    self.navigationController?.setViewControllers(vc!, animated: false)        
}