无法在 UIView 中加载控制器的视图

Posted

技术标签:

【中文标题】无法在 UIView 中加载控制器的视图【英文标题】:Can't load a controller's view inside of an UIView 【发布时间】:2021-01-14 20:01:59 【问题描述】:

我有PhotosGridController,它只添加了一个collectionView 作为它的视图的子视图。这个 Viewcontroller 拥有它的 collectionView 的所有委托和数据源,所以,我的代码变得更干净了。

我还有一个MainPageController,它有另一个collectionView(主要的),在其中,它是一个自定义单元格(名为MainPageCell)。这个单元格有一个名为imageViewGrid 的UIView,它的目的是显示PhotoGridController 的视图。但这里有一个错误:当我在添加 PhotosGridController 作为 MainPageController 的 childController 之后运行我的代码,并将它的视图添加为 imageViewGrid 子视图时,在显示的单元格上没有正确加载 .实际上,当我向下/向上滚动时,我可以看到所需的 collectionView 几乎一秒钟,当我停止滚动时,它又消失了。

MainPage collectionView 的数据源:

extension MainPageController 

. . .

func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! MainPageCell
    
    displayController(contentController: photoGridController, on: cell.imageViewGrid)
    cell.layoutIfNeeded()
    
    return cell


MainPage displayController 方法:

extension MainPageController 

func displayController(contentController content: UIViewController, on view: UIView) 
    self.addChild(content)
    view.addSubview(content.view)
    content.didMove(toParent: self)
    content.view.layoutIfNeeded()
    content.view.becomeFirstResponder()



PhotoGrid 数据源:

extension PhotosGridController 

. . .

func collectionView(_ collectionView: UICollectionView,
                    cellForItemAt indexPath: IndexPath) -> UICollectionViewCell 
    
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: reuseIdentifier, for: indexPath) as! PhotoGridCell
    
    cell.backgroundColor = Colors.lightBlue
    cell.item = names[indexPath.item]
    
    return cell


. . .


我认为问题出在 MainPage 上的 cellForItemAt 方法上,但我不知道如何解决。如果您需要更多代码,请告诉我。

注意:如果我将 PhotosGridController 设置为 SceneDelegate 上的 rootViewController,它会完美加载并在模拟器上显示所需的屏幕。

【问题讨论】:

【参考方案1】:

尝试在 didMove 之后调整内容视图的大小

例子:

content.view.frame = view.bounds
content.view.autoresizingMask = [.flexibleWidth, .flexibleHeight]
content.didMove(toParent: self)

【讨论】:

完成,错误仍然存​​在。

以上是关于无法在 UIView 中加载控制器的视图的主要内容,如果未能解决你的问题,请参考以下文章

Swift 2 - 无法在单独的 ViewController 中加载 UIWebView

控制器已在 DOM 中加载,但视图未加载且无法找到控制器 - oclazyload with jam(pugjs)

我在应用程序委托中加载的视图控制器(在导航控制器中)与标签栏重叠

在导航视图控制器中加载特定视图

快速在视图控制器中加载集合视图控制器

在标签栏控件中加载视图控制器