【问题标题】:Attempt to present "ChatController" on "RoomViewController" which is already presenting "ConfirmUser"尝试在已经呈现“ConfirmUser”的“RoomViewController”上呈现“ChatController”
【发布时间】:2021-11-05 22:24:57
【问题描述】:

我试图在关闭 ConfirmUser 后显示 ChatController,但收到以下警告:

尝试在已呈现 ConfirmUser 的 RoomViewController(来自 RoomViewController)上呈现 ChatController。

这是我的代码:

confirmPopup.dismiss(animated: false, completion: { [self] in
    dialogIsShowing = false
            
    let story = UIStoryboard(name: "Chat", bundle: nil)
    let chat = story.instantiateViewController(withIdentifier: "chat_controller") as? ChatController
    chat?.roomCreator = byUser
            
    controller!.present(chat!, animated: true, completion: nil)
})

【问题讨论】:

  • 如果animatedtrue,它有效吗?我想知道,有时当动画在其他方法中设置为真/假时,行为可能会有所不同......
  • 你可能混淆了你的视图控制器:controller 是什么?你打电话给dismiss 换取confirmPopup,然后打电话给controller.present——confirmPopup 有什么东西吗?它是否应该将 controller 呈现的视图控制器视为奇怪的副作用?
  • @Larme animate = true 不工作
  • 如果 VC A 提供 VC B,而 VC B 提供 VC C (A -> B -> C) 并且您调用 B.dismiss,它会解雇 C(仅)。如果您调用 A.dismiss,它会关闭 B 和 C,同时为 C 设置动画。如果您调用 C.dismiss,它将在内部调用 B.dismiss。

标签: ios swift xcode uiviewcontroller modal-dialog


【解决方案1】:

您在 confirmPopup 关闭之前展示了聊天控制器。我猜,在解除操作完成之前,正在调用解除方法正在执行的完成。 你必须这样做:

confirmPopup.dismiss(animated: false, completion: nil)

dialogIsShowing = false            
let story = UIStoryboard(name: "Chat", bundle: nil)
let chat = story.instantiateViewController(withIdentifier: "chat_controller") as? ChatController
chat?.roomCreator = byUser
            
controller!.present(chat!, animated: true, completion: nil)

【讨论】:

  • 代码在补全中完成,所以应该完成了,见developer.apple.com/documentation/uikit/uiviewcontroller/…
  • 谢谢@Larme。是否仍然发出相同的警告 Besart ?
  • @Amais Sheikh 是的,仍然是同样的警告
  • @Besart 在您为 ChatController 调用 present 时交叉检查控制器是否正在呈现某些内容。
猜你喜欢
  • 2017-05-24
  • 2016-10-20
  • 2015-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-07
  • 2014-10-02
  • 1970-01-01
相关资源
最近更新 更多