快速从另一个视图控制器显示视图控制器的问题

时间:2019-04-22 05:40:05

标签: swift presentviewcontroller

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

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和编程,因此如果某些逻辑存在缺陷,请原谅我。谢谢!

1 个答案:

答案 0 :(得分:0)

除非绝对必要,否则不应调用根窗口来提供视图控制器。从本质上讲,您将控制器视为浏览器窗口中的选项卡。像回到窗口一样,清除所有选项卡(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. 像上面一样指定模式过渡