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

时间:2017-07-01 00:54:48

标签: ios swift uiviewcontroller pushviewcontroller dismiss

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

总的来说,我要做的是关闭两个视图控制器,然后将第三个视图控制器推送到第四个视图控制器。基本上这就是路径:vcA(被驳回) - > vcB(已解雇) - > vcC推送到vcD(最终目的地)。

这是我目前的流程代码。请注意我能够解除前两个视图控制器,但我无法弄清楚如何推送第三个视图控制器。无论如何,这是我的代码:

代码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:如果您想知道我为什么要解除视图并以这种方式呈现它们,那是因为我需要将数据通过这些视图传递到聊天记录控制器中。

2 个答案:

答案 0 :(得分:1)

第一点。
检查vcC的navigationController,它可能是零。
看起来你调用类方法tr = datasets.MNIST('../data', train=True, download=True, transform=transform) te = datasets.MNIST('../data', train=False, transform=transform) train_loader = DataLoader(tr, batch_size=args.batch_size, shuffle=True, num_workers=4, **kwargs) test_loader = DataLoader(te, batch_size=args.batch_size, shuffle=True, num_workers=4, **kwargs) NewConversationController,(不熟悉swift,或者这两个方法)不是实例方法。 也许它不是正确的vcC,只是一个新的vcC?

PS:很奇怪你vcA.presentingViewController被解雇两次并根据你所说的,它只是解雇罚款。 如果你能描述你如何呈现vcA,vcB或者给出演示来展示它是如何工作的,我想它可能会有所帮助。

答案 1 :(得分:0)

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

您无法将视图控制器推送到视图中,如果它被解除,它会消失,因此推送另一个视图是不合逻辑的,导致父视图控制器被删除。

你要做的是 - vcA - &gt;目前的vcB - &gt;解雇vcB - &gt; vcC上的vcC推送vcD&gt;解雇vcC

您可以通过通知执行此操作。您甚至可以使用委托模式完成任务。将vcB作为vcC的委托,当vcB解散时通知vcB然后解除vcB然后只是在vcC上推送vcD。

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