2014-09-22 3 views
1

Я задал аналогичный вопрос на прошлой неделе, но я думаю, что я его сузил до более конкретно, что происходит не так. Пользовательская ячейка загружается и выглядит корректно, когда я использую collectionView.dequeReusableCellWithIdentifier("MenuCell", forIndexPath: indexPath) as MenuCollectionViewCell «MenuCell» - это идентификатор повторного использования для моей настраиваемой ячейки, а MenuCollectionViewCell - это быстрый файл, содержащий собственный код. От отладки кода я определил, что UIImageView не загружается. Я сделал чек, и это то, что я придумал. Почему ImageView не загружается и появляется только как ноль, которого я не знаю. Я выложу код для файла, где он загружается, и пользовательский код ячейки.UIImageView возвращает нуль в пользовательском UICollectionViewCell

class MenuViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate 
{ 
    // Not sure if I really need this 
    @IBOutlet var menuCollectionView: MenuCollectionView! 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view 
     view.backgroundColor = UIColor(patternImage: UIImage(contentsOfFile: "behind_alert_view.png")) 
     // This was the fix here 
     self.menuCollectionView.delegate = self 
     self.menuCollectionView.dataSource = self 

    } 

    // Variables 
    var menuImagesArray = ["MyProfileIcon.png"] 

    // Data Source Protocol 
    func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int 
    { 
     return 1 
    } 

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int 
    { 
     return menuImagesArray.count 
    } 

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell 
    { 
     var menuCell: MenuCollectionViewCell = collectionView.dequeueReusableCellWithReuseIdentifier("MenuCell", forIndexPath: indexPath) as MenuCollectionViewCell 

     var image: UIImage! 

     if ((menuCell.imageView) != nil) 
     { 
      image = UIImage(named: menuImagesArray[indexPath.row]) 
     } 

     menuCell.imageView.image = image 



     return menuCell 
    } 

} 

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

class MenuCollectionViewCell: UICollectionViewCell 
{ 
    @IBOutlet var imageView: UIImageView! 

} 

Ошибка, я получаю это прекращение из-за разворачивания ноль значения необязательного. Проблема в том, что UIImageView наверняка, любая помощь в этом будет замечательной!

РЕДАКТИРОВАТЬ/решаемые

Проблема заключалась в том подключение к UICollectionView. У меня была ссылка на него, но я не использовал ее должным образом. Я пытался установить dataSource и делегировать его в раскадровку, и это казалось проблемой для меня. Когда я перешел к коду и сделал ссылку и ссылался на нее так, как я сделал с этими двумя вызовами, она мгновенно ее исправила. Надеюсь, это поможет кому-то другому, если они столкнутся с одной и той же проблемой! Теперь настраиваем его, так как он всплывает!

+0

Вы подключили выход изображения в IB? Вы изменили класс ячейки в IB на MenuCollectionViewCell? – rdelmar

+0

Я попытался подключить изображениеView в IB, и я получил сообщение о том, что вы не можете подключиться к ячейке прототипа. И да, я убедился, что класс был изменен правильно. Может быть, imageView может быть подключен, и я пошел об этом неправильно? – SamG

+0

Розетка должна быть выполнена в пользовательском подклассе ячеек, а не в контроллере (именно поэтому вы получили эту ошибку). – rdelmar

ответ

1

Проблема была вовсе не с UIImageView. Рделмар был прав в своем заявлении о проверке правильности торговых точек. Ссылка на выход menuCollectionView не была связана должным образом, и это вызывало ошибку. Зафиксировав соединение @IBOutlet и установив делегат и источник данных через код, а не возившись с раскадрой, он немедленно устранил проблему. Код, который я использовал для установки делегата и источника данных, выглядит следующим образом и зависит только от правильного соединения.

self.menuCollectionView.delegate = self 
self.menuCollectionView.dataSource = self 

Простое исправление действительно. Надеюсь, это поможет кому-то другому, если они столкнутся с подобной проблемой! Сначала проверьте соединения! Затем пройдите и убедитесь, что все делает то, что нужно!

6

Подключение UICollectionView, поскольку вы делаете вверху, не обязательно, поскольку это уже сделано, но назначить делегат и источник данных. Это можно сделать следующим образом:

self.collectionView?.delegate = self 
self.collectionView?.dataSource = self 

Я нашел этот ответ и был очень взволнован, потому что у меня была именно эта проблема. Однако, после проверки моей возможности подключения и обеспечения правильного назначения делегата и источника данных, мой ImageView по-прежнему равен нулю.

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

self.myCollectionView.registerClass(MyCollectionViewCell.self, forCellWithReuseIdentifier: Constants.reuseIdentifier) 

Это замена регистрации в раскадровке и в результате ImageView но для меня. После того как я удалил код, все сработало. Спасибо за ваш вопрос SamG и надеюсь, что это поможет другим, у кого может быть одна из этих двух проблем.

+0

Спасибо, Андрей! Я столкнулся с этой проблемой, пытаясь отобразить простое изображение в подклассе collectionviewcell. Пользовательский объект ячейки был возвращен, но свойство imageView всегда было равно нулю. Удаление вызова registerClass также исправил его для меня. –

0

Для меня никакое решение этой часто обсуждаемой темы не помогало напрямую. Наконец, я решил это с добавлением «Collection Reusable View» -identifier в пользовательскую ячейку раскадровки.Это значение I установлено на то же значение, что и в DataSource-Function dequeueReusableCell (withReuseIdentifier: ...). Я думаю, что это очень простая вещь :)

Смежные вопросы