Ali Ihsan URAL
Ali Ihsan URAL

Reputation: 1974

What is the difference of implementation between UITableView & UICollectionView when using Xib?

I try to implement TableView and CollectionView with Xib Files. I implement UITableview properly but when I try to implement ColletionView I get an error "libc++abi.dylib: terminating with uncaught exception of type NSException". I got this error in var collectionView = UICollectionView() line. Why I dont get this error this line var tableView = UITableView() ? And where is my mistake ? And What is the solution ? Thanks in advance.

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

Upvotes: 0

Views: 90

Answers (2)

Scriptable
Scriptable

Reputation: 19750

UICollectionView requires a UICollectionViewLayout in order to render. When creating a collection view via the storyboard this is already set with a default value.

You can initialise it like this:

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

Flow layout

A concrete layout object that organizes items into a grid with optional header and footer views for each section.

The flow layout is one of the default/built in options and is useful for creating a 'bookshelf' style grid in which the columns fill left to right and then top to bottom (unless you change the width).

There is a good tutorial on the Ray Wenderlich website which explains more about collection views and their layouts

Upvotes: 2

Ilya Kharabet
Ilya Kharabet

Reputation: 4621

You need to use other init to create UICollectionView instance:

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

Upvotes: 4

Related Questions