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

Dismiss Two View Controllers and then Push a View Controller - Swift

我在这个问题中处理了 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:如果您想知道为什么我想关闭视图并以这种方式呈现它们,那是因为我需要通过这些视图将数据传递到聊天日志控制器中。

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

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

您可以使用通知模式。 如果您想直接从 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。

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