viewWithTag in UICollectionViewCell returns nil in

2019-05-16 11:08发布

问题:

This lengthy title is roughly my problem. I started simple learning example using UICollectionView in Swift project.

I added CollectionView to ViewController created by template, assigned delegate and data source. Custom cell is created in storyboard. Reuse identifier is set.

Everything is fine so far. I have placed one UILabel in custom cell, and gave tag value 100.

Here's code of my ViewController: https://gist.github.com/tomekc/becfdf6601ba64d5fd5d

And interesting exceprt below:

func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("element", forIndexPath: indexPath) as UICollectionViewCell

        cell.backgroundColor = UIColor.yellowColor()

        // list subviews
        NSLog("--- ROW %d ---", indexPath.row)
        printSubviews(cell)

        if let labelka = cell.viewWithTag(100) as? UILabel {
            labelka.text = String(format: "Row %d", indexPath.row)
            NSLog("Found label")
        }


        return cell
    }


    func printSubviews(view:UIView) {
        if let list = view.subviews as? [UIView] {
            for uiv in list {
                NSLog("%@ tag:%d", uiv, uiv.tag)
                printSubviews(uiv)
            }
        }
    }

The problem is that cell.viewWithTag(100) returns nil until cell is reused. When I scroll the view so any of cells goes out of window and reuse is forced, viewWithTag(100) returns the label and I can set its value.

What's interesting, I put together similar example in Objective-C and there is no such problem. Even when built and run with XCode6 beta4.

I wonder if I missed something or this is wrong behavior?

Update: apparently I took too simplistic approach. When I created custom UICollectionViewCell subclass (as I usually do), result is correct.