Swift - 如何在两个视图控制器后弹出视图?

3

我有一个带有一些UIViewControllers和我的主要UINavigationController的Storyboard。

然后我有一个UIViewController,在其中当tableViewdidSelectRowAtIndexPath被选中时,我弹出了UIViewController

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

        let provider = self.results[indexPath.row]

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

这很好,因为我可以返回到之前的视图,但是我需要返回两个视图。
该怎么实现呢?
4个回答

10
你可以使用popToViewController(_:animated:)方法来返回前两个页面:
if let viewControllers = self.navigationController?.viewControllers {
    if viewControllers.count > 3 {
        self.navigationController?.popToViewController(viewControllers[viewControllers.count - 3], animated: true)
    } else {
                // fail
    }
}

由于问题和您的答案都是使用Swift编写的,您可能考虑将内联方法签名格式化为popToViewController(_:animated:),而不是-popToViewController:animated: - undefined

3

UINavigationController会将推送的控制器保存在堆栈中。因此,您只需指定要显示的视图控制器的索引即可。

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

1
在执行弹出动画之前,移除未显示的视图控制器。
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)
}

1

听起来你需要的是一个取消转场,查看这篇文章

你需要创建一个具有以下签名的方法(该链接中的博客文章是关于Objective C的)

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

回 unwind segue 应该让你在导航堆栈中返回到任何需要的位置。
祝好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接