NSCollectionViewItem Index setzen via Button

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSCollectionViewItem Index setzen via Button

    Hi. Drag & Drop funktioniert im NSCollectionView mittlerweile perfekt. Bin sehr zufrieden. Jetzt soll es möglich sein, ein zugeordnetes Tag auch wieder zu entfernen. Dazu habe ich im NSView des NSCollectionViewItem einen kleinen Lösch Button reingebastelt. Wenn der User diesen drückt, soll eine Methode ausgeführt werden. Darin soll der Löschcode ablaufen. Ich müßte dann wissen, welches Tag (ManagedObject) selektiert wurde. Ich komm aber nicht auf die Lösung. Habe schon observeForValueKeyPath implementiert. Allerdings wird natürlich beim Klicken auf den Button nicht das CollectionViewItem als selektiert gesetzt. Ich hatte gehofft, so an den Index ranzukommen.


    Quellcode

    1. //Observer for the collection view array controller selection: "selectionIndexes"
    2. - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    3. if([keyPath isEqualTo:@"selectionIndexes"])
    4. {
    5. //True if in the array controller of the collection view really exists at least a selected object
    6. if([[tagsArrayController selectedObjects] count] > 0) {
    7. NSLog(@"Selected objects: %@", [tagsArrayController selectedObjects]);
    8. }
    9. else {
    10. NSLog(@"Observer called but no objects where selected.");
    11. }
    12. }
    13. }
    Alles anzeigen


    Das Log sagt:
    2010-11-28 12:10:25.702 XXX[3606:a0f] Selected objects: (
    "<Tag: 0x100560a20> (entity: Tag; id: 0x1005b2270 <x-coredata://4703ED5D-B44E-4D0D-9FB8-D5A280B7168D/Tag/p116> ; data: {\n xxxx = (\n );\n name = \"Letzter Tag\";\n})"
    )


    Irgendwelche Ideen, wie man das rauskriegen könnte? Danke. Kay.
  • Am einfachsten geht das, wenn Du von NSCollectionViewItem ableitest und das im IB entspr. einträgst:

    Quellcode

    1. @class MyItem : NSCollectionViewItem
    2. {
    3. ...
    4. }
    5. - (IBAction)remove:(id)sender;

    die representedObject-Property setzt Du dann auf Dein NSManagedObject und holst Dir diese dann in -remove ab:

    Quellcode

    1. - (IBAction)remove:(id)sender
    2. {
    3. NSManagedObject *mo = self.representedObject;
    4. ...
    5. }

    Es wäre noch zu überlegen, statt eines NSCollectionViews ein NSTokenField für die Tags zu benutzen...

    Gruß, Markus
  • Ach ja, es gibt noch ein recht hilfreiches WWDC Session-Video von 2010: Cocoa Tips and Tricks.
    Da erklären sie die manuelle Nib-Instanzierungsmethode, die NSCollectionView ab 10.6 benutzt und damit endlich benutzbar wird. Mit selbiger Technik und etwas glue-Code lässt sich auch unter 10.5 mit NSCollectionView arbeiten.

    Gruß, Markus