2015-05-05 15 views
6

Ich komme aus der iOS-Entwicklung und ich frage mich, ob es eine Möglichkeit gibt, eine programmgesteuert wie eine UICollectionView in iOS? Und fügen Sie die NSCollectionViewItems in Code hinzu. Oder ist der einzige Weg, um eine Bindungen zu verwenden?Gibt es eine Möglichkeit, eine NSCollectionView in Swift programmgesteuert einzurichten?

Vielen Dank!

+0

die letzte Frage zu beantworten, nein, die Sie nicht brauchen Bindungen verwenden. Es gibt keine Ansicht oder Kontrolle, für die Sie Bindungen verwenden müssen. – stevesliva

+0

Aber wie kann ich es ohne Bindungen tun? – stefOCDP

+1

Konvertieren [this] (http://stackoverflow.com/questions/8660626/how-to-create-nscollectionview-programatically-from-scratch) zu swift. – stevesliva

Antwort

5

Dank @stevesliva für mich auf this SO answer zeigen. Ich habe es in Swift umgewandelt. Das habe ich bekommen.

Ich bin ein NSCollectionView in der Viewcontroller zu schaffen:

import Cocoa 

class ViewController: NSViewController { 

var titles = [String]() 
var collectionView: NSCollectionView? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.titles = ["Banana", "Apple", "Strawberry", "Cherry", "Pear", "Pineapple", "Grape", "Melon"] 
    collectionView = NSCollectionView(frame: self.view.frame) 
    collectionView!.itemPrototype = CollectionViewItem() 
    collectionView!.content = self.titles 
    collectionView!.autoresizingMask = NSAutoresizingMaskOptions.ViewWidthSizable | NSAutoresizingMaskOptions.ViewMaxXMargin | NSAutoresizingMaskOptions.ViewMinYMargin | NSAutoresizingMaskOptions.ViewHeightSizable | NSAutoresizingMaskOptions.ViewMaxYMargin 

    var index = 0 
    for title in titles { 
     var item = self.collectionView!.itemAtIndex(index) as! CollectionViewItem 
     item.getView().button?.title = self.titles[index] 
     index++ 
    } 
    self.view.addSubview(collectionView!) 

} 
} 

Die erstellte CollectionViewItem im Viewcontroller laden Sie einfach einen Blick, wo ich selbst das Element Ansicht einrichten.

import Cocoa 

class CollectionViewItem: NSCollectionViewItem { 

var itemView: ItemView? 

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

override func loadView() { 
    self.itemView = ItemView(frame: NSZeroRect) 
    self.view = self.itemView! 
} 

func getView() -> ItemView { 
    return self.itemView! 
} 
} 

Die Ansicht selbst:

import Cocoa 

class ItemView: NSView { 

let buttonSize: NSSize = NSSize(width: 100, height: 20) 
let itemSize: NSSize = NSSize(width: 120, height: 40) 
let buttonOrigin: NSPoint = NSPoint(x: 10, y: 10) 

var button: NSButton? 

override func drawRect(dirtyRect: NSRect) { 
    super.drawRect(dirtyRect) 

    // Drawing code here. 
} 

override init(frame frameRect: NSRect) { 
    super.init(frame: NSRect(origin: frameRect.origin, size: itemSize)) 
    let newButton = NSButton(frame: NSRect(origin: buttonOrigin, size: buttonSize)) 
    newButton.bezelStyle = NSBezelStyle.RoundedBezelStyle 
    self.addSubview(newButton) 
    self.button = newButton; 
} 

required init?(coder: NSCoder) { 
    fatalError("init(coder:) has not been implemented") 
} 

func setButtonTitle(title: String) { 
    self.button!.title = title 
} 
} 

die Schaltfläche Titel setzen, ich bin mit Art ein Hack. (die For-Schleife im ViewController) Wenn es eine bessere Möglichkeit gibt, den Titel zu setzen, können Sie gerne einen Kommentar hinterlassen.

+0

So legen Sie den Schaltflächentitel fest: Verwenden Sie in der for-Schleife des ViewControllers: 'item.representedObject = title'. Dann in ItemView: 'NSButton * aButton = [[NSButton Alloc] initWithFrame: NSMakeRect (10, 10, 100, 20)]; [aButton bind: NSTitleBinding toObject: self withKeyPath: @ "reprotectedObject" Optionen: @ {NSNullPlaceholderBindingOption: @ "Kein Titel"}]; [self.view addSubview: aButton]; ' Verwenden Sie nicht 'button.title = representObject', da das reprotectedObject zu diesem Zeitpunkt nicht bekannt ist.Die Bindung wird zur Laufzeit aufgelöst. –

4

für Swift 2.0, müssen Sie die collectionView!.autoresizingMask Linie ändern:

lange Hand:

collectionView?.autoresizingMask = NSAutoresizingMaskOptions([NSAutoresizingMaskOptions.ViewWidthSizable,NSAutoresizingMaskOptions.ViewMaxXMargin,NSAutoresizingMaskOptions.ViewMinYMargin,NSAutoresizingMaskOptions.ViewHeightSizable,NSAutoresizingMaskOptions.ViewMaxYMargin]) 

oder kurzerhand:

collectionView?.autoresizingMask = NSAutoresizingMaskOptions([.ViewWidthSizable,.ViewMaxXMargin,.ViewMinYMargin,.ViewHeightSizable,.ViewMaxYMargin]) 
0

Sie müssen einzubetten NSCollectionView innerhalb NSScrollView . Code ist unten in Swift 4

Setup-NSCollectionView

let layout = NSCollectionViewFlowLayout() 
layout.minimumLineSpacing = 4 

collectionView = NSCollectionView() 
collectionView.dataSource = self 
collectionView.delegate = self 
collectionView.collectionViewLayout = layout 
collectionView.allowsMultipleSelection = false 
collectionView.backgroundColors = [.clear] 
collectionView.isSelectable = true 
collectionView.register(
    Cell.self, 
    forItemWithIdentifier: NSUserInterfaceItemIdentifier(rawValue: "Cell") 
) 

Setup-NSScrollView

scrollView = NSScrollView() 
scrollView.documentView = collectionView 
view.addSubview(scrollView) 

Hier ist ein einfaches NSCollectionViewItem

class Cell: NSCollectionViewItem { 
    let label = NSTextField() 
    let imageView = NSImageView() 

    override func loadView() { 
    self.view = NSView() 
    self.view.wantsLayer = true 
    } 
} 
Verwandte Themen