【问题标题】:Issues with presenting view controller from another view controller in swift快速从另一个视图控制器呈现视图控制器的问题
【发布时间】:2019-09-11 08:45:57
【问题描述】:

我在展示另一个视图控制器时遇到问题。我能够做到这一点的唯一方法是使用这行代码:

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(如第一行代码)是个好主意,什么时候可以接受以模态方式呈现视图控制器。我的应用程序将处理存储少量数据,那么长期传输这些数据的最佳方式是什么。

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

【问题讨论】:

    标签: swift presentviewcontroller


    【解决方案1】:

    除非绝对必要,否则不应调用根窗口来呈现视图控制器。本质上,您可以将控制器视为浏览器窗口中的选项卡。像这样回到窗口就像清除所有选项卡(排序)。

    至于为什么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. 像上面那样指定一个模态转换

    【讨论】:

    • 非常感谢您提供的信息!对我这样的初学者来说非常有用。我应该提到我根本没有使用故事板。我使用以下代码将我的 VC1 更改为我的应用程序委托中的 UINavigationController:window = UIWindow(frame: UIScreen.main.bounds) window?.makeKeyAndVisible() let layout = UICollectionViewFlowLayout() let headerController = HeaderController(collectionViewLayout: layout) window?.rootViewController = UINavigationController(rootViewController: headerController) 然后当我尝试 .push 时没有任何反应。
    • 另外,当我将 VC2 包装在 UINavigationController 中时(正如您在帖子中所说),Xcode 说我需要定义一个非零布局参数,尽管我认为我这样做了。这是我的参考代码:let layout = UICollectionViewFlowLayout() let partyPage = UINavigationController(rootViewController: PartyMemberPage(collectionViewLayout: layout)) partyPage.modalTransitionStyle = .flipHorizontal self.present(partyPage, animated: true, completion: nil)
    • @joker449 你需要定义你的布局。不能通过调用 UICollectionViewFlowLayout() 将其初始化为空
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-11-20
    相关资源
    最近更新 更多