Чому розетка UICollectionViewCell нульова?


143

Я створив користувальницький UICollectionViewCell в Interface Builder, прив’язав погляди на нього до класу, і тоді, коли я хочу використовувати та встановити рядок до мітки на рядку, ярлик має нульове значення.

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, але ви цього не робите. Чи можете ви println або NSLog "клітинку" себе?
— mc01

1
Якщо я видалю "!" або використовувати "?" у визначенні класу я отримую помилку чи збій компілятора. "!" є типовим, коли ви прив'язуєте його.
— Янош

і сама клітина: <xxx.LeftMenuCollectionViewCell: 0x7aa7b320; baseClass = UICollectionViewCell; кадр = (0 0; 180 50); layer = <CALayer: 0x7aa6f810 >>
— János

Всі торгові точки підключені в IB? Чи працюють інші торгові точки? Не бачте жодних очевидних проблем, вибачте.
— mc01

Відповіді:


310

Я self.collectionView.registerClass(LeftMenuCollectionViewCell.self, forCellWithReuseIdentifier: "ls")знову дзвоню . Якщо ви використовуєте табло, ви не хочете називати це . Це замінить те, що є у вашій розкадровці.

Якщо у вас все ще виникають проблеми, перевірте, наскільки reuseIdentifierвона однакова в dequeueReusableCellWithReuseIdentifier і в storyboard.


18
Дякую! На це витратили більше години, як використовували користувацьку клітинку.
— DogCoffee

У мене така ж проблема, але ніколи не використовував цей рядок коду, у вас є ідеї, чому я отримую той самий виняток?
— Декел Маман

Дякую. це вирішило це для мене. У мене була сценарна таблиця, і я вручну додав контролер перегляду. код котла включав згаданий вами рядок. навіть якщо це здавалося правильним (правильний ідентифікатор та клас), він відмовився підключати розетки. тепер це працює. солодкий!
— Йоріс Веймар

13
Якщо ви використовуєте табло, ви не хочете називати це. Це замінить те, що є у вашій розкадровці. <- Цей справді мені допоможе
— Sruit A.Suk

6
GAH, яка жахлива річ у шаблоні UICollectionViewController !!!!! Спасибі, Янош.
— Кенні Вайланд

53

Просто видаліть цей рядок:

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

3
Я не розумію, чому за це було проголосовано. Це була відповідь на мою проблему.
— Фелікс Сімес

1
Це правильна відповідь і повинна бути відповідно відзначена особою, яка поставила запитання. Було б також чудово зрозуміти, чому це працює :)
— Кіко Лобо

3
Гадаю, це було неприйнятним, тому що на це питання відповіли в самому серпні 14 року ... хоча ця відповідь знову копіює відповідь знову, через кілька місяців.
— Нітін Найн

1
Але коли я не користуюсь цим, він дає мені помилку Заява твердження в - [UICollectionView _dequeueReusableViewOfKind: withIdentifier: forIndexPath: viewCategory:]
— Shaheera

Пояснення, чому ця лінія не потрібна, буде вітатися. Наразі додано коробку Xcode для нового виду колекції.
— пкамб

47

Якщо ви використовуєте xib, переконайтеся, що ви додали цей рядок коду до завантаженого перегляду.

Мета C:

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

Швидкий:

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

чи потрібно реєструвати і клас, і nib, або достатньо лише nib?
— RainCast

3
Я щойно зареєстрував ручку, і це вирішило мої проблеми.
— Амелія

Схоже, є два способи реєстрації, і я використовував неправильний ... collectionView? 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", пакет: nil), forCellWithReuseIdentifier: "yourIdentifier")

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.