关闭两个视图控制器,然后推送一个视图控制器 - Swift

Posted

技术标签:

【中文标题】关闭两个视图控制器,然后推送一个视图控制器 - Swift【英文标题】:Dismiss Two View Controllers and then Push a View Controller - Swift 【发布时间】:2017-07-01 00:54:48 【问题描述】:

我有 4 个视图控制器正在处理这个问题。为简单起见,我将它们称为 vcA、vcB、vcC 和 vcD。

总的来说,我想要做的是关闭两个视图控制器,然后将第三个视图控制器推送到第四个视图控制器。基本上这就是路径的走向:vcA(dismissed) -> vcB(dismissed) -> vcC pushes to vcD(final destination)。

这是我当前的流程代码。请注意,我可以关闭前两个视图控制器,但我不知道如何推送第三个视图控制器。无论如何,这是我的代码:

vcA 代码:

@IBAction func createGroupButtonTapped(_ sender: Any) 
    if groupNameTextField.text == "" 
        ProgressHUD.showError("Please enter a group title")
     else 

        self.presentingViewController?.dismiss(animated: false, completion: nil)

        NewConversationController().showDisplayConversationsController(title: self.groupNameTextField.text!, groupThumbnail: self.groupImageView, members: CreateConversationPopOver.groupMembers)

        self.presentingViewController?.dismiss(animated: true, completion: nil)

    

在上面的代码中,我关闭了前两个视图控制器,并在 vcB 中调用了一个函数。 vcB 中的这个函数调用了vcC 中的一个函数。下面是函数的代码:

vcB 中的功能:

func showDisplayConversationsController(title: String, groupThumbnail: UIImageView, members: Array<String>) 
    dismiss(animated: true, completion: nil)
    DisplayConversationsController().showViewChatController(title: title, groupThumbnail: groupThumbnail, members: members)

vcC 中的功能:

func showViewChatController(title: String, groupThumbnail: UIImageView, members: Array<String>) 
    let viewChatController = ViewChatController(collectionViewLayout: UICollectionViewFlowLayout())
    viewChatController.hidesBottomBarWhenPushed = true

    viewChatController.groupThumbnail = groupThumbnail
    viewChatController.groupMembers = members
    viewChatController.groupTitle = title

    navigationController?.pushViewController(viewChatController, animated: true)

这个问题发生在 VCC 中,视图控制器从不推送到最终目的地,也就是所谓的 vcD。我在上面的函数中添加了断点,它们都被调用了。所以代码正在运行。

我不知道为什么视图控制器不会推送,因为即使经过多次测试,我的所有函数都被调用了。

任何帮助将不胜感激。谢谢!

PS:如果您想知道为什么我要关闭视图并以这种方式呈现它们,那是因为我需要通过这些视图将数据传递到聊天日志控制器中。

【问题讨论】:

【参考方案1】:

首先。 检查vcC的navigationController,可能是nil。 看来你调用类方法NewConversationControllerDisplayConversationsController,(不熟悉swift,或者这两个是)不是实例方法。 也许它不是正确的 vcC,只是一个新的 vcC?

PS:很奇怪,你 vcA.presentingViewController 解雇了两次,根据你所说的,它只是解雇了。 如果你能描述你如何展示 vcA、vcB 或提供一个演示来展示它是如何工作的,我认为这可能会有所帮助。

【讨论】:

所以导航控制器为零。所以我决定创建一个。然而,即使我这样做了,推动仍然没有奏效 @RohanVasishth 所以导航控制器是零?看来您没有调用正确的 vcC,您只是创建了一个不可见的新 vcC。你可以创建一个属性调用 vcCreference,这样你就可以使用 vcA.vcCreference showViewChatController 方法 @RohanVasishth 你可以看到这个passing-data-between-view-controllers 将数据从一个视图控制器传递到另一个 您向我展示的帖子通过情节提要完成了所有工作。请注意,我正在以编程方式完成所有这些工作。因此,您能否向我展示一个帖子或向我展示如何创建诸如 vcCreference 之类的属性调用。 @RohanVasishth 可以在你的情况下在 github 上给我一个演示,这样我就可以知道如何将 vcA 数据传递给 vcC,而不是 vcB,简单的方法是将数据传递给 vcB,然后从vcB 到 vcC。你也可以用luckyShubhra的方式——只发通知,把所有数据放在notification.userInfoNotification pass data,这个链接可能对你有帮助【参考方案2】:

您也可以使用通知模式。 如果您想直接从 vcA 切换到 VcD,请在切换到 vcD 之前在 vcA 中触发通知。使 vcB、vcC 作为同一通知的侦听器。当您直接从 vcA 切换到 vcD 时,如果 vcB 和 vcC 已经存在,则会收到通知。处理 vcB 和 vcC 中的通知,因此根据需要处理 dismissViewControllerPopViewController。您甚至可以使用通知将数据从 vcA 直接传递到 vcD。

您不能将视图控制器推送到已关闭的视图中,如果已关闭,它会消失,因此推送另一个视图是不合逻辑的,因为父视图控制器已被删除。

你要做的是 - vcA --> Present vcB --> Dismiss vcB --> Present vcC Push vcD on vcC > Dismiss vcC

您可以通过通知来做到这一点。您甚至可以使用委托模式完成任务。将 vcB 设为 vcC 的代表,当 vcB 关闭时通知 vcB,然后关闭 vcB,然后将 vcD 推送到 vcC。

希望对您有所帮助。快乐编码!

【讨论】:

我很困惑。通知是什么意思。另外,我想先解散到 vcC,然后再转到 vcD 进行动画处理。 通知模式是使用 NSNotification 中心在两个类之间进行通信的方式。 您需要显示您的 vcC,然后关闭,然后导航到您的 vcD?? 不,我需要关闭 vcA 和 vcB 才能到达 vcC,然后从 vcC 推送到 vcD

以上是关于关闭两个视图控制器,然后推送一个视图控制器 - Swift的主要内容,如果未能解决你的问题,请参考以下文章

关闭多个推送的视图控制器

关闭没有 NavigationController 的推送视图控制器

推然后模态然后推?

如何在ios中自定义推送和弹出动画时将视图传递给另一个控制器? [关闭]

关闭模态,然后立即推视图控制器

关闭多个视图控制器