Создание пользовательского UICollectionViewCell
для моего UICollectionViewController
, он работает, регистрируя nib; однако, не удается зарегистрировать класс.
Использование registerClass() - fail
Регистрирование по классу кажется правильным - оно строит, но генерирует исключение во время выполнения, освобождая дополнительные элементы из UIView. Без ссылок на торговые точки он работает; однако в представлении коллекции нет ячеек.
collectionView?.registerClass(MyCollectionViewCell.self,
forCellWithReuseIdentifier: "myCell")
Ясно, что представление не загружено; однако, я думаю, что настройка пользовательского класса ячейки обеспечит необходимую связь.
Использование registerNib() - работает
Регистрация с помощью nib-работ, что имеет смысл, поскольку она явно загружает представление.
let nib = UINib(nibName: "MyCollectionViewCell", bundle: nil)
collectionView?.registerNib(nib, forCellWithReuseIdentifier: "myCell")
Здесь явно ссылаются на представление, а для представления настраивается собственный класс; однако что-то об этом кажется неправильным.
Пример проекта
Изоляция проблемы в примере проекта, ниже - виды и код для репликации; или этот проект доступен в GitHub.
Main.storyboard
Мой главный контроллер начального представления раскадровки является UICollectionViewController
подклассом как MyCollectionViewController
:
MyCollectionViewController.swift
Показывает как регистрацию по nib, так и по классу:
import UIKit
class MyCollectionViewController: UICollectionViewController {
var data = [String]()
override func viewDidLoad() {
super.viewDidLoad()
data = ["a", "b", "c"]
// This works, by nib
let nib = UINib(nibName: "MyCollectionViewCell", bundle: nil)
collectionView?.registerNib(nib, forCellWithReuseIdentifier: "myCell")
// This fails, by class
//collectionView?.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: "myCell")
}
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
return data.count
}
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCellWithReuseIdentifier("myCell", forIndexPath: indexPath) as! MyCollectionViewCell
cell.title.text = data[indexPath.row]
return cell
}
}
MyCollectionViewCell.xib
Вид является UICollectionViewCell
подклассом как MyCollectionViewCell
с UILabel
:
В моем nib идентификатор коллекционного повторного просмотра был установлен: myCell
:
MyCollectionViewCell.swift
Определяет класс и имеет IBOutlet
для метки:
import UIKit
class MyCollectionViewCell: UICollectionViewCell {
@IBOutlet weak var title: UILabel!
}
Используя nib, выполнение появляется как:
Почему я не могу зарегистрировать UICollectionViewCell
по классу?
Кроме того, я немного неясен относительно того, должна ли ячейка прототипа оставаться на главном контроллере представления коллекции раскадровки. Там я не определил идентификатор многократного использования.