Чому розетка 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.