关闭两个视图控制器,然后推送一个视图控制器 - 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方法NewConversationController
DisplayConversationsController
,(不熟悉swift,或者这两个是)不是实例方法。
也许它不是正确的 vcC,只是一个新的 vcC?
PS: 很奇怪,你vcA.presentingViewController解雇了两次,按你说的,解散就好了。
如果您能描述一下您是如何呈现 vcA、vcB 或提供演示来展示它是如何工作的,我认为这可能会有所帮助。
您可以使用通知模式。
如果您想直接从 vcA 切换到 VcD,请在切换到 vcD 之前在 vcA 中触发通知。使 vcB、vcC 作为同一通知的侦听器。当您直接从 vcA 切换到 vcD 时,如果 vcB 和 vcC 已经存在,则会收到通知。在 vcB 和 vcC 中处理通知,因此根据需要处理 dismissViewController
或 PopViewController
。您甚至可以使用通知将数据从 vcA 直接传递到 vcD。
您不能将视图控制器推送到已关闭的视图中,如果它被关闭,它就会消失,因此推送另一个视图是不合逻辑的,因为父视图控制器已被删除。
你要做的是 - vcA --> Present vcB --> Dismiss vcB --> Present vcC Push vcD on vcC > Dismiss vcC
您可以通过通知来做到这一点。您甚至可以使用委托模式完成任务。将 vcB 作为 vcC 的委托,在 vcB 关闭时通知 vcB,然后关闭 vcB,然后将 vcD 推送到 vcC。
希望对您有所帮助。编码愉快!!
我在这个问题中处理了 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方法NewConversationController
DisplayConversationsController
,(不熟悉swift,或者这两个是)不是实例方法。
也许它不是正确的 vcC,只是一个新的 vcC?
PS: 很奇怪,你vcA.presentingViewController解雇了两次,按你说的,解散就好了。 如果您能描述一下您是如何呈现 vcA、vcB 或提供演示来展示它是如何工作的,我认为这可能会有所帮助。
您可以使用通知模式。
如果您想直接从 vcA 切换到 VcD,请在切换到 vcD 之前在 vcA 中触发通知。使 vcB、vcC 作为同一通知的侦听器。当您直接从 vcA 切换到 vcD 时,如果 vcB 和 vcC 已经存在,则会收到通知。在 vcB 和 vcC 中处理通知,因此根据需要处理 dismissViewController
或 PopViewController
。您甚至可以使用通知将数据从 vcA 直接传递到 vcD。
您不能将视图控制器推送到已关闭的视图中,如果它被关闭,它就会消失,因此推送另一个视图是不合逻辑的,因为父视图控制器已被删除。
你要做的是 - vcA --> Present vcB --> Dismiss vcB --> Present vcC Push vcD on vcC > Dismiss vcC
您可以通过通知来做到这一点。您甚至可以使用委托模式完成任务。将 vcB 作为 vcC 的委托,在 vcB 关闭时通知 vcB,然后关闭 vcB,然后将 vcD 推送到 vcC。
希望对您有所帮助。编码愉快!!