在 swift 中从另一个视图控制器呈现视图控制器的问题



我在呈现另一个视图控制器时遇到问题。我能够实现这一目标的唯一方法是使用以下代码行:

UIApplication.shared.keyWindow?.rootViewController?.present(partyMemberPage, animated: false, completion: nil)

这是整个函数:

func partyMemberPage() {
    let layout = UICollectionViewFlowLayout()
    let partyMemberPage = PartyMemberPage(collectionViewLayout: layout)
    UIApplication.shared.keyWindow?.rootViewController?.present(partyMemberPage, animated: false, completion: nil)
    print("from SplitButton")
}

即使上面的代码有效,我也很好奇为什么下面的代码不起作用。我尝试的所有内容都收到一个错误,说我需要用非 nil 布局参数初始化UICollectionView

self.present(partyPage, animated: true, completion: nil)

几乎肯定我有合适的项目可以使用self.present(),但我无法让它在这个 vc 上工作。

PS:我也很好奇什么时候更改rootViewController是个好主意(比如第一行代码(,什么时候可以接受模式呈现视图控制器。我的应用程序将处理存储少量数据,因此长期传输该数据的最佳方法是什么。

非常感谢所有帮助。如果需要,我可以提供更多代码。我对 swift 和编程很陌生,所以如果某些逻辑有缺陷,请原谅我。谢谢!

除非绝对必要,否则不应调用根窗口来显示视图控制器。实质上,您可以将控制器视为浏览器窗口中的选项卡。像这样返回窗口就像清除所有选项卡(sorta(。

至于为什么self.present()不起作用,可能有几个原因。

如果使用情节提要,则需要以不同的方式引用视图:P

也再次尝试使用self.present(),如果它抛出错误阅读它或

发布你的问题

completion: nil是不必要的。

由于我不知道你的具体情况,所以我给你几个选择。我将第一个视图称为 VC1,将第二个视图称为视图 VC2

  1. 将 VC1 包装在导航控制器中,然后尝试使用 .push((
  2. 将VC2包装在导航控制器中,如下所示:(我在自己的项目中使用此代码,以便我可以验证它是否有效(
 let loginView = UINavigationController(rootViewController: LoginViewController())
            loginView.modalTransitionStyle = .flipHorizontal
            self.present(loginView, animated: true) 
  1. 指定我上面所说的模态过渡

最新更新