在我的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?
答案 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)
}