使用 Xib 时 UITableView 和 UICollectionView 的实现有啥区别?

Posted

技术标签:

【中文标题】使用 Xib 时 UITableView 和 UICollectionView 的实现有啥区别?【英文标题】:What is the difference of implementation between UITableView & UICollectionView when using Xib?使用 Xib 时 UITableView 和 UICollectionView 的实现有什么区别? 【发布时间】:2018-10-04 07:53:47 【问题描述】:

我尝试使用 Xib 文件实现 TableView 和 CollectionView。我正确实现了 UITableview,但是当我尝试实现 ColletionView 时出现错误 “libc++abi.dylib:以 NSException 类型的未捕获异常终止”。我在var collectionView = UICollectionView() 行中收到此错误。 为什么我在这一行var tableView = UITableView() 没有收到此错误?我的错误在哪里?解决方案是什么?提前致谢。

var tableView = UITableView()
var collectionView = UICollectionView()

override func viewDidLoad() 
    super.viewDidLoad()

    let headerMenu = UIView()
    headerMenu.translatesAutoresizingMaskIntoConstraints = false
    headerMenu.backgroundColor = .green
    self.view.addSubview(headerMenu)

    headerMenu.heightAnchor.constraint(equalToConstant: 48.0).isActive = true
    headerMenu.widthAnchor.constraint(equalToConstant: UIScreen.main.bounds.width).isActive = true
    headerMenu.topAnchor.constraint(equalTo: view.safeTopAnchor).isActive = true


    collectionView.delegate = self
    collectionView.dataSource = self
    collectionView.translatesAutoresizingMaskIntoConstraints = false
    headerMenu.addSubview(collectionView)

    collectionView.topAnchor.constraint(equalTo: headerMenu.topAnchor, constant: 0).isActive = true
    collectionView.bottomAnchor.constraint(equalTo: headerMenu.bottomAnchor, constant: -10).isActive = true
    collectionView.rightAnchor.constraint(equalTo: headerMenu.rightAnchor, constant: -10).isActive = true
    collectionView.leftAnchor.constraint(equalTo: headerMenu.leftAnchor, constant: 10).isActive = true

    collectionView.register(UINib(nibName: "MenuCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "MenuCollectionViewCell")


    let mainView = UIView()
    mainView.translatesAutoresizingMaskIntoConstraints = false
    self.view.addSubview(mainView)
    mainView.topAnchor.constraint(equalTo: headerMenu.bottomAnchor, constant: 0).isActive = true
    mainView.bottomAnchor.constraint(equalTo: view.safeBottomAnchor, constant: 0).isActive = true
    mainView.rightAnchor.constraint(equalTo: view.safeRightAnchor, constant: 0).isActive = true
    mainView.leftAnchor.constraint(equalTo: view.safeLeftAnchor, constant: 0).isActive = true
    mainView.backgroundColor = UIColor.white

    tableView.delegate = self
    tableView.dataSource = self
    tableView.translatesAutoresizingMaskIntoConstraints = false
    tableView.estimatedRowHeight = UITableViewAutomaticDimension
    mainView.addSubview(tableView)

    tableView.topAnchor.constraint(equalTo: mainView.topAnchor, constant: 0).isActive = true
    tableView.bottomAnchor.constraint(equalTo: mainView.bottomAnchor, constant: -10).isActive = true
    tableView.rightAnchor.constraint(equalTo: mainView.rightAnchor, constant: -10).isActive = true
    tableView.leftAnchor.constraint(equalTo: mainView.leftAnchor, constant: 10).isActive = true
    tableView.separatorStyle = .none
    tableView.register(UINib(nibName: "ProductTableViewCell", bundle: nil), forCellReuseIdentifier: "ProductTableViewCell")
    

【问题讨论】:

UICollectionView 需要提供 UICollectionViewLayout 属性 是真的吗? . lazy var myCollectionView : UICollectionView = let layout = UICollectionViewFlowLayout() let cv = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout) cv.translatesAutoresizingMaskIntoConstraints = false cv.delegate = self cv.dataSource = self cv.backgroundColor = .yellow return简历 () 这是一种方法,是的,你不需要让它变得懒惰 【参考方案1】:

你需要使用其他init来创建UICollectionView实例:

let layout = UICollectionViewFlowLayout()
let collectionView = UICollectionView(frame: rect, collectionViewLayout: layout)

【讨论】:

【参考方案2】:

UICollectionView 需要 UICollectionViewLayout 才能渲染。通过情节提要创建集合视图时,这已设置为默认值。

你可以这样初始化它:

let flowLayout = UICollectionViewFlowLayout()
let collectionView = UICollectionView(frame: self.view.bounds, collectionViewLayout: flowLayout)

流式布局

一个具体的布局对象,将项目组织成一个网格,每个部分都有可选的页眉和页脚视图。

flow layout 是默认/内置选项之一,可用于创建“书架”样式网格,其中列从左到右然后从上到下填充(除非您更改宽度)。

有一个good tutorial on the Ray Wenderlich 网站解释了有关集合视图及其布局的更多信息

【讨论】:

由于某些信息,我接受您的回答。谢谢。

以上是关于使用 Xib 时 UITableView 和 UICollectionView 的实现有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

用于 UITableView 的自定义 XIB 单元格在滚动时卡住/卡住

如何在 .xib 文件中使用自定义 UITableView 和 UITableViewCell?

UITableView 和自定义 UITableViewCell 使用 .xib

在XIB文件中添加带有动态内容的UITableView

无法为自定义 UITableView 单元设置约束,在 xib 中创建,因为所有数据在大小类更改时消失

UITableViewCell 比它的 UITableView 更宽 - 向右延伸?