2016-06-01 10 views
1

Ich habe eine NSCollectionView, die eine Reihe von Elementen anzeigt, die "ImageCollectionViewItem" s aufgerufen werden. Ich habe eine ImageCollectionViewItem.xib-Datei, die ausschließlich über ein NSView verfügt, das das Element abdeckt. Ich möchte in der Lage sein, dynamisch zu ändern, was in dieser Ansicht ist, aber wenn ich versuche, darauf Bezug zu nehmen, ist es null. Ich habe schon Fragen wie: outlets in UIViewController nil in viewdidload, das ist nicht mein Problem ist, dass ich es verbunden und ich habe den ausgefüllten KreisNSCollectionViewItem hat keine Ausgänge in itemForRepresentedObjectAtIndexPath

Hier ist die Viewcontroller Erweiterung:

extension ViewController : NSCollectionViewDataSource { 

    func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { 
     return titles.count 
    } 
    func collectionView(collectionView: NSCollectionView, itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem { 
     let item = collectionView.makeItemWithIdentifier("ImageCollectionViewItem", forIndexPath: indexPath) as! ImageCollectionViewItem 

     //This is what is nil: 
     let thisView = item.iconView 

     return item 
    } 

} 

Und dann ist hier der ImageViewCollectionItem Code

class ImageCollectionViewItem: NSCollectionViewItem { 

    @IBOutlet weak var iconView: NSView! 

    var numItem: Int? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do view setup here. 

     view.wantsLayer = true 
     view.layer?.backgroundColor = NSColor.whiteColor().CGColor 
    } 
} 

Antwort

4

Das ist etwas seltsames Zeug in der Kakaowelt. Aber hier ist ein Fluss, der helfen sollte. Öffnen Sie Ihre ImageCollectionViewItem.xib im Interface Builder, ziehen Sie "Collection View Item" aus der Objektbibliothek, wählen Sie sie aus, und legen Sie den benutzerdefinierten Klassennamen auf ImageCollectionViewItem fest, und makeItemWithIdentifier sollte ein Nicht-Nil-Element erstellen.

In meinem Beispiel habe ich Tile-Klasse:

class Tile: NSCollectionViewItem { 

Und hier ist, wie ich die Fliesen schaffen:

func collectionView(collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { 

    return items.count 
} 


func collectionView(collectionView: NSCollectionView, 
        itemForRepresentedObjectAtIndexPath indexPath: NSIndexPath) -> NSCollectionViewItem { 

    let item = collectionView.makeItemWithIdentifier("Tile", forIndexPath: indexPath) as! Tile 
    return item 


} 

Hier ist das Bild von IB:

enter image description here

Wenn Sie diese Schritte ausführen, werden Ihre Steckdosen bei der Erstellung verbunden. In meinem Fall habe ich 2 Steckdosen:

class Tile: NSCollectionViewItem { 

@IBOutlet weak var bigScrollView: ItemScrollView! 
@IBOutlet weak var smallScrollView: ItemScrollView! 

override func awakeFromNib() { 
    super.awakeFromNib() 
} 

override func viewDidAppear() { 
    // 
} 

} 

Und sie sind beide verbunden zu werden, wie Sie auf dem Bild sehen kann:

enter image description here

+0

Ich habe das gleiche Problem und versucht, Ihre Lösung Eugene, jedoch Ich bekomme immer noch nichts für meine Bildansicht. Ich habe versucht, eine neue Filiale mit dem Namen myImageView zu erstellen, und sie gibt auch nil zurück. –

+0

Können Sie ein Beispielprojekt teilen? Ich bin mir sicher, dass es etwas übersehen wird. Geschieht mir gelegentlich auch. –