Почему розетка UICollectionViewCell равна нулю?


143

Я создал пользовательский UICollectionViewCell в Интерфейсном Разработчике, связал представления этого класса с классом, а затем, когда я хочу использовать и установить строку для метки в строке, метка имеет нулевое значение.

override func viewDidLoad() {
    super.viewDidLoad()

    // Register cell classes
    self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")
}

override func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {

    var cell: LeftMenuCollectionViewCell
    cell = collectionView.dequeueReusableCellWithReuseIdentifier("ls", forIndexPath: indexPath) as LeftMenuCollectionViewCell
    println(cell.label) // <- this is nil, why??
    cell.label.text = "asd"

    return cell
}

И подклассная клетка:

class LeftMenuCollectionViewCell: UICollectionViewCell {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var label: UILabel!
    @IBOutlet weak var activityIndicatorView: UIActivityIndicatorView!
}

Есть ли причина, по которой вы используете явное "!" кроме имен типов везде? Кажется излишним, особенно в IBOutlets. Единственное место, где это может иметь значение, - это когда вы удаляете ячейку из очереди как LeftmenuCollectionViewCell, но вы не делаете это там. Можете ли вы напечатать ln или NSLog саму «ячейку»?
mc01

1
Если я уберу "!" или используйте "?" в определении класса я получаю ошибку компилятора или сбой. "!" по умолчанию, когда вы связываете это.
Янош

муравья самой ячейки: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; кадр = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
Янош

Все розетки подключены в IB? Работают ли другие магазины? Не вижу других очевидных проблем, извините.
mc01

Ответы:


310

Я self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")снова звоню . Если вы используете раскадровку, вы не хотите называть это . Это перезапишет то, что у вас есть в вашей раскадровке.

Если у вас есть чек проблемы кастрированный баран reuseIdentifierэто же в dequeueReusableCellWithReuseIdentifier и в storyboard.


18
Спасибо! Потратил на это больше часа, так как использовал обычную камеру.
DogCoffee

У меня та же проблема, но я никогда не использовал эту строку кода, у вас есть идея, почему я получаю такое же исключение?
Декель Маман,

Спасибо. это решило это для меня. у меня была раскадровка, и я вручную добавил контроллер представления. в шаблонный код включена указанная вами строка. хотя он казался правильным (правильный идентификатор и класс), он отказывался соединять розетки. теперь это работает. сладкий!
Йорис Веймар

13
Если вы используете раскадровку, вы не хотите называть это. Это перезапишет то, что у вас есть в вашей раскадровке. <- Это действительно
помогает

6
ГАХ, какая ужасная вещь в шаблоне UICollectionViewController !!!!! Спасибо, Янош.
Кенни Уайлэнд

53

Просто удалите эту строку:

self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")

3
Я не понимаю, почему за это проголосовали. Это был ответ на мою проблему.
Félix Simões

1
Это правильный ответ, и он должен быть помечен соответствующим образом человеком, который задал вопрос. Также было бы здорово понять, почему это работает :)
Кико Лобо

3
Думаю, это было отклонено, потому что на вопрос был дан ответ в самом авг'14 ... в то время как этот ответ просто копирует ответ здесь, спустя несколько месяцев.
Нитин Нейн

1
Но когда я не использую его, он выдает ошибку «Ошибка подтверждения» в - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
Shaheera

Объяснение того, почему эта строка не нужна, приветствуется. В настоящее время он добавлен образцом XCode для нового представления коллекции.
Пкамб

47

Если вы используете xib, убедитесь, что вы добавили эту строку кода в свою viewdidload.

Цель C:

[self.collectionView registerNib:[UINib nibWithNibName:@"MyCell" bundle:nil] forCellWithReuseIdentifier:@"MyCellIdentifier"];

Swift:

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

Вы должны зарегистрировать и класс, и перо, или достаточно только перо?
RainCast

3
Я только что зарегистрировал перо, и это решило мои проблемы.
Амелия

Похоже, есть два способа регистрации, и я использовал неправильный ... collectionView? .Register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier") collectionView? .Register (YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier")
Серхио

17

Должен зарегистрироваться, что ребята!

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

6

Похоже, есть два способа регистрации, и я первым использовал неправильный. У меня есть пользовательское представление xib, поэтому зарегистрировано со вторым параметром, и у нас есть данные!

1:

collectionView?.register(YourItemClassName.self, forCellWithReuseIdentifier: "yourIdentifier") 

2:

collectionView?.register(UINib(nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

0

У меня была похожая проблема, но моя ошибка заключалась в том, что я не делегировал CollectionViewCell возможность изменять текст метки.


0

Я думаю, что лучшим решением является непосредственное использование из раскадровки, где добавляется CollectionView, альтернативно, вам нужно удалить CollectionViewCellсо своего CollectionViewв раскадровке и зарегистрировать ячейку с помощью следующей команды:

collectionView? .register (UINib (nibName: "YourItemClassName", bundle: nil), forCellWithReuseIdentifier: "yourIdentifier")

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.