我的故事板包含一些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)
}
这样可以正常工作,因为我返回上一个视图,但我需要返回两个视图。
我怎样才能做到这一点?
答案 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)
}