UIImageView在自定义UICollectionViewCell中返回nil

时间:2014-09-22 14:11:17

标签: ios swift uiimageview

上周我问了一个类似的问题,但我想我已经把它缩小到更具体的问题。当我使用collectionView.dequeReusableCellWithIdentifier("MenuCell", forIndexPath: indexPath) as MenuCollectionViewCell" MenuCell"正在加载自定义单元格并且看起来正确调用是自定义单元格的重用标识符,MenuCollectionViewCell是保存自定义代码的swift文件。从调试代码我已经确定没有加载UIImageView。我做了一张支票,这就是我想出来的。为什么没有加载ImageView并且只显示为nil我不知道。我将发布加载它的文件的代码和自定义单元代码。

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!

}

由于解包可选的nil值,我收到的错误是终止。问题是UIImageView肯定,任何帮助解决这个问题都会很棒!

EDIT /解决

问题是与UICollectionView的连接。我有参考它,但我没有正确使用它。我试图在故事板中设置dataSource和委托,这对我来说似乎是个问题。当我移动到代码并制作引用并以我对这两个调用所做的方式引用它时,它立即修复它。我希望如果他们遇到同样的问题,这可以帮助别人!现在开始自定义它,因为它弹出来了!

3 个答案:

答案 0 :(得分:6)

不需要像在顶部那样连接UICollectionView,因为已经完成了,但是分配了委托和数据源。这可以通过这种方式完成:

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

我找到了这个答案并且非常兴奋,因为我确实遇到了这个问题。但是,在检查我的连接并确保正确分配了委托和数据源之后,我的imageView仍然是零。

原来,我已经在故事板中注册了我的新子类,所以我不得不从我的代码中删除这个调用:

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

这取代了故事板中的注册,导致imageView对我来说是零。删除代码后,事情奏效了。感谢SamG的问题,并希望这可以帮助其他可能遇到这两个问题的人。

答案 1 :(得分:1)

问题根本不在于UIImageView。 Rdelmar在检查出口是否正确的声明中是正确的。 menuCollectionView的出口参考未正确链接,这导致错误弹出。通过修复@IBOutlet连接并通过代码设置委托和dataSource而不是弄乱故事板,它立即解决了问题。我用来设置委托和dataSource的代码如下,仅取决于连接是否是正确的连接。

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

真的很简单。我希望如果他们遇到类似的问题,这可以帮助别人!首先检查连接!然后通过并确保一切都在做它应该做的事情!

答案 2 :(得分:0)

对我而言,这个经常讨论的主题的解决方案没有直接帮助。最后,我通过在故事板自定义单元格中添加“Collection Reusable View”标识来解决它。我将此值设置为与DataSource-Function dequeueReusableCell(withReuseIdentifier:...)中相同的值。我认为这是一个非常基本的事情:)