具有全页单元格的UICollectionView与具有子视图控制器的UIScrollView

时间:2018-07-26 06:31:02

标签: ios swift uiscrollview uicollectionview

我正在尝试创建一个ViewController,它具有可滑动(类似于Android的标签)页面。这些页面本身将具有滚动视图(垂直),并具有多个视图,这些视图将根据响应类型(每个页面的不同网络调用)动态添加。我无法使用PageViewController,因为我希望页面仅占据屏幕的一半。

问题与CollectionView-

  • 如果单元将被重用(或从内存中删除),我将如何维护单元UI的状态并存储该数据(对于视图而言尤其困难,因为每个页面中的视图类型可能不同)

问题与ScrollView-

  • 我担心如果所有页面视图控制器都位于每个视图都在内存中的情况下,是否会出现内存问题

PS-每页中的数据为4-10个堆栈视图,每个视图包含2-10个图像/标签,或仅一个collectionview

PSS-选项卡总数不超过10,最小值为1

1 个答案:

答案 0 :(得分:4)

我用 collectionView 实现了它,因为它实际上应该更有效地利用资源。但是然后我们需要缓存视图控制器的状态。这是示例

比方说,您有一个控制器A,其中包含带有子控制器的单元格的collectionView。然后在单元格中排

....
var childrenVC: [Int: UIViewController] = [:]
....
// cell for row
let cell: ChildControllerCell = collectionView.dequeueReusableCell(for: indexPath)
if let childController = childrenVC[indexPath.row] {
   cell.contentView.addSubview(childController.view)
   childController.view.frame = cell.contentView.frame
} else {
   let childViewController = ChildViewController()
   addChildViewController(childViewController)
   childViewController.didMove(toParentViewController: self)
   cell.contentView.addSubview(childController.view)
   childController.view.frame = cell.contentView.frame
   childrenVC[indexPath.row] = childViewController
   cell.childVC = childViewController
}
return cell
....
class ChildControllerCell: UICollectionViewCell {
     var childVC: UIViewController?
     override func prepareForReuse() {
        super.prepareForReuse()
        if !contentView.subviews.isEmpty {
            childVC?.willMove(toParentViewController: nil)
            childVC?.view.removeFromSuperview()
            childVC?.removeFromParentViewController()
        }
    }
}