Swift - 如何将popViewControllerAnimated返回两个视图

时间:2016-07-12 22:16:01

标签: swift swift2

我的故事板包含一些UIViewControllers和我的主UINavigationController

然后我有一个UIViewController在tableView didSelectRowAtIndexPath我弹出UIViewController

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!){

        let provider = self.results[indexPath.row]

        self.delegate?.didProviderSelected(provider)
        self.navigationController?.popViewControllerAnimated(true)
    }

这样可以正常工作,因为我返回上一个视图,但我需要返回两个视图。

  

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:6)

你可以使用 popToViewController(_:animated:)弹出前两个视图:

if let viewControllers = self.navigationController?.viewControllers {
    if viewControllers.count > 3 {
        self.navigationController?.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
    } else {
                // fail
    }
}

答案 1 :(得分:3)

UINavigationController将推送的控制器保持在堆栈中。所以你可以指定要显示的viewController的索引。

let controller = self.navigationController?.viewControllers[1] // it is at index 1. index start from 0, 1 .. N    
self.navigationController?.popToViewController(controller!, animated: true)

答案 2 :(得分:1)

听起来你需要的是Unwind Segue,查看this post

您需要创建一个具有以下签名的方法(该链接中的博客文章位于目标C上)

@IBAction func segueUnwinder(segue: UIStoryboardSegue) {
    return
}

unwind segue可让您在导航堆栈中尽可能地返回。

祝你好运!

答案 3 :(得分:0)

删除未显示视图控制器"幕后"在弹出动画之前:

func tableView(tableView: UITableView!, didSelectRowAtIndexPath indexPath: NSIndexPath!) {

    let provider = self.results[indexPath.row]

    self.delegate?.didProviderSelected(provider)
    if let count = self.navigationController?.viewControllers.count where count > 2 {
        self.navigationController?.viewControllers.removeAtIndex(count - 2)
    }
    self.navigationController?.popViewControllerAnimated(true)
}