Почему розетка 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")
Sergio
источник
0

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

justRadojko
источник
0

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

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

dgalluccio
источник