如何以编程方式弹出一个视图控制器并呈现一个新的

Posted

技术标签:

【中文标题】如何以编程方式弹出一个视图控制器并呈现一个新的【英文标题】:How to programmatically pop a view controller and present a new one 【发布时间】:2018-09-14 14:21:21 【问题描述】:

我要做的是呈现一个viewController,当用户触摸一个按钮时,我想调用popViewController,然后呈现一个不同的viewController。但我不知道该怎么做。

我尝试过的一些事情是调用pop然后立即调用present,延迟后调用present,用完成块pup pop,然后在完成块中调用present,以及其他想法。

我认为我把整个事情复杂化了,我相信他们应该是一个简单的方法来做到这一点。

感谢您对此的任何帮助。

澄清:

我这样做是在触摸:

        if let vc = UIStoryboard(name: "Listing", bundle: nil).instantiateInitialViewController() as? ListingViewController
    
        vc.listing = listing
        vc.editListing = forEdit
        vc.title = " "
        self.navigationController?.pushViewController(vc, animated: true)
    

当用户触摸按钮时,我会从该 VC 执行此操作:

self.navigationController?.popViewController(animated: true)

当 VC 离开时,我想做这样的事情:

        if let vc = UIStoryboard(name: "CreateListing", bundle: nil).instantiateInitialViewController() as? NewCreateListingViewController
    
        vc.bMakeSimiliar = makeSimiliar
        vc.listing = listing
        vc.editListing = editListing
        vc.title = " "
        self.navigationController?.pushViewController(vc, animated: true)
    

基本上我的用户正在查看第一个控制器,它是一个列表,从列表 VC 他触摸一个按钮来添加一个新列表,所以我想关闭列表视图控制器并向他展示创建列表视图控制器。

当我执行上面的代码来呈现新的 VC 时,什么也没有发生。我在 popViewController 之后立即执行此操作。

【问题讨论】:

需要出示相关代码。视图控制器是如何显示的?如果出现,则需要将其关闭,而不是弹出。 【参考方案1】:

您不使用 pop 来在堆栈中显示 next 控制器。 Pop 实际上是从当前控制器导航回来的。

要执行您想要实现的目标,您需要调用 navigationController.pushViewController(viewController: UIViewController, animated: Bool) 方法。

为了回到之前使用的视图控制器: navigationController.popViewController(animated: Bool)

为了访问您使用的根视图控制器: navigationController.popToRootViewController(animated: Bool)

为了访问您使用的堆栈中的某些特定视图控制器: popToViewController(viewController: UIViewController, animated: Bool)

【讨论】:

所以如果我调用 push 会出现新的 VC,但是当用户返回时,它会将他们带到哪里?我希望他们在上一个之前回到 VC。 好吧,对不起,我说的有点不对。我已经推了VC。然后用户触摸一个按钮。在触摸时,我想弹出 VC 并展示/推送一个新的 VC。但是从新的VC回来,我想去上一个之前的那个。我会更新我的问题。 @LilMoke 检查更新的答案!您正在寻找popToViewController 不等,我试过了,我的问题是第二个视图控制器没有显示。如果我在弹出后立即调用 present ,则新控制器不会出现。 好的,那么。只是为了澄清。您的用例是:控制器 A -> 推送控制器 B,当用户触摸控制器 B 中的按钮时,您想显示控制器 C,但是当弹出控制器 C 时,您想显示控制器 A?

以上是关于如何以编程方式弹出一个视图控制器并呈现一个新的的主要内容,如果未能解决你的问题,请参考以下文章

Swift 从按钮内部、弹出框和单元格以编程方式在地图顶部打开一个新的视图控制器

如何以编程方式在导航控制器上推送下一个视图控制器?

如何以编程方式快速使用情节提要 ID 获取当前视图控制器(当前正在呈现)?

以编程方式创建和呈现模态视图控制器

如何使我的键盘弹出窗口更加流畅,我的视图控制器以模态方式出现?

iOS如何在弹出顶视图控制器时以编程方式检测?