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

问题描述 投票:0回答:1

我无法从另一个视图控制器中呈现视图控制器。我能够实现这一目标的唯一方法是使用以下代码:

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")
}

即使上面的代码工作,我很好奇为什么下面的代码不起作用。我尝试的一切,我得到一个错误说我需要用非零布局参数初始化UICollectionView

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

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

PS:我也很好奇什么时候改变rootViewController(比如第一行代码)以及何时只能模态地呈现viewcontrollers是个好主意。我的应用程序将处理存储少量数据,因此长期传输数据的最佳方式是什么。

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

swift presentviewcontroller
1个回答
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. 如上所述指定模态转换
© www.soinside.com 2019 - 2024. All rights reserved.