0

У меня есть пользовательский UICollectionViewCell, который я пытаюсь передать значение с моего контроллера представления. Я могу передать изображение в ячейку, но при инициализации все остальное приходит в ноль.Как передать значение пользовательскому UICollectionViewCell?

Соответствующий код в View Controller:

override func viewDidLoad() { 

    self.collectionView!.registerClass(MyCustomCell.self, forCellWithReuseIdentifier: "Cell") 

} 

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

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! MyCustomCell 

    cell.someValue = 5 
    cell.imageView.image = UIImage(named: "placeholder.png") 

    return cell 

} 

В классе пользовательские ячейки:

var someValue: Int! 
var imageView: UIImageView! 

override init(frame: CGRect) { 

    super.init(frame: frame) 

    imageView = UIImageView(frame: CGRectMake(0, 0, frame.width, frame.height)) 
    contentView.addSubview(imageView) 

    let someValueLabel = UILabel() 
    someValueLabel.frame = CGRectMake(0, 75, 200, 30) 
    someValueLabel.text = "Value is: \(someValue)" 
    self.addSubview(someValueLabel) 
} 

Изображение успешно прошло от UICollectionView, и я могу показать его, но «SomeValue 'всегда ноль.

Что я делаю неправильно?

+0

Кроме того, вы не должны называть свой объект UIImageView «imageView». Поскольку UITableViewCell уже содержит имя, использующее это имя. Это может привести к нежелательному эффекту. Возможно, это было исправлено, но я уже столкнулся с некоторыми проблемами. Подобно этому Q: http://stackoverflow.com/questions/11681273/uitableviewcell-imageview-changing-on-select – BoilingLime

ответ

2

Метод init называется намного раньше, чем вы думаете, это - в процессе dequeue - когда объект ячейки сконструирован. Часть процесса инициализации состоит в том, чтобы прикрепить UIViews, разработанный в раскадровке. Таким образом, изображение работает, потому что UIImageView уже находится в качестве контейнера во время процесса загрузки раскадровки (NIB), и вы просто устанавливаете его свойство внутреннего изображения позже.

Вы правильно установили значение someValue для всех будущих использования при обработке ячеек и обработке событий. Так, например, если есть обработчик @IBAction, который запускается после того, как ячейка отображается и отображается, у нее действительно будет доступ к someValue. Вот где должна пройти тестовая печать. Что вы в конечном счете , используяsomeValue для?

Followup

Так что это просто ошибка; вам просто нужно установить текстовое значение в cellForRowAtIndexPath. Вам не нужна копия данных модели в ячейке (т. Е. Нет необходимости иметь поле someValue в вашей ячейке). Просто настроить пользовательский интерфейс динамически из ваших (правильно отделенных) моделей данных:

вместо:

cell.someValue = 5 

Вам просто нужны, например:

cell.someValueLabel.text = "\(indexPath.row)" // or where ever you're getting your underlying model data from 

Это заблуждение использовать init для любого из это. Единственной ответственностью init для ячеек таблицы является выделение памяти. Ячейка является полностью динамическим, временным объектом, и все его свойства, отражающие данные приложения, должны быть установлены в методе cellForRowAtIndexPath. Визуальный рендеринг ячейки ждет завершения метода cellForRowAtIndexPath, поэтому проблема синхронизации не возникает.

+0

В реальной версии я пытаюсь передать значение indexPath.item, чтобы я мог сделать некоторые незначительные изменения внешнего вида ячейки во время init на основе любого содержимого, которое он отображает. – Nitroid

+0

Это неправильное представление о внесении изменений во время 'init'. Единственная ответственность' init' для ячеек таблицы - выделить память. Ячейка - это полностью динамический, временный объект, и все его свойства, отражающие данные приложения, должны быть установлены в методе 'cellForRowAtIndexPath'. Визуальный рендеринг ячейки ждет завершения метода 'cellForRowAtIndexPath', поэтому проблема с синхронизацией отсутствует. – BaseZen

0

Вы устанавливаете значение someValue после инициализации ячейки.

Вы вызываете print("Passed value is: \(someValue)") во время процесса инициализации.

Установите точку останова на метод init вашего класса ячеек. Вы должны увидеть, что он проходит через него до того, как вы присвоите значение 5 этой переменной.

1

Метод Init вызывается при создании экземпляра UICollectionView.Вы регистрируете «someValue» в методе init, и это слишком рано. Изображение отображается, поскольку вы работаете с ImageView напрямую, который уже был создан. Попробуйте записать imageView.image в метод init, он также должен быть nil (или, может быть, не ноль, потому что ячейка используется повторно).

Вы должны выполнить свою работу в специализированных установщиках переменных и геттерах, где вы уверены, что они не ноль.

var someValue: Int!{ 
    didSet { 
     print("Passed value is: \(newValue)") 
    } 
} 
Смежные вопросы