6 Stimmen

SelectionIndexes auf NSArrayController geben nur einen Wert zurück

Ich habe eine NSCollectionView, deren Inhalt von einem NSArrayController behandelt wird. Die NSCollectionView ist auswählbar und ich muss eine Liste der ausgewählten Elemente abrufen. Ich versuche, die Schlüsseleigenschaft von NSArrayController "selectionIndexes" zu beobachten, aber es gibt mir nur IMMER den Wert des ersten Elements in CollectionView und nicht die ausgewählten Elemente.

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if([keyPath isEqualTo:@"selectionIndexes"])
    {
        //True if in the array controller of the collection view really exists at least a selected object
        if([[arrayController selectedObjects] count] > 0)
        {
            NSLog(@"Selected objects: %@", [arrayController selectedObjects]);
        }
        else
        {
            NSLog(@"Observer called but no objects where selected.");
        }
    }
}

UPDATE

Ich bekomme diese Methode nie aufgerufen, wenn ich NSLog(@"Selected objects: %@", [arrayController selectedObjects]) manuell aufrufe, erhalte ich Folgendes

Das Ergebnis sieht immer folgendermaßen aus

ENDE UPDATE

2011-07-05 20:44:45.711 collectionView2[2153:903] Selected objects 1: (
    "<Hormiga: 0x10013e330>"
)

Ich glaube, ich habe etwas falsch gemacht Bindung NSArrayController mit NSCollectionView. Was könnte mein Fehler sein? Sagen Sie mir, wenn Sie mehr Informationen möchten, ich kann sogar das gesamte Programm in einem Zip posten, wenn Sie es benötigen.

UPDATE 2

Dies ist der Code, den ich in meinem Controller verwende, um den arrayController "selectionIndexes" Schlüssel zu beobachten.

[arrayController addObserver:self forKeyPath:@"selectionIndexes" options:NSKeyValueObservingOptionNew context:nil];

UPDATE 3

Eines der Probleme wurde behoben, ich habe vergessen, die Bindung zwischen NSArrayController und NSCollectionView relativ zu dem Schlüssel "selectionIndexes" zu setzen. Jetzt kann ich manuell die Liste der selectedObject abrufen und es ist korrekt!

Mein letztes Problem ist, dass ich die Benachrichtigung nicht erhalte, wenn selectionIndexes sich ändert. So observeValueForKeyPath:ofObject:change:context: nie aufgerufen werden!

UPDATE 4

Ich habe versucht, den Beobachter in der init-Methode meines Controllers zu setzen, aber auf diese Weise ist der arrayController immer noch null. Verschieben der addObserver in der awakeForNib behoben alle meine Probleme!

10voto

Wenn Sie die Auswahlindizes des Array Controllers mit denen der Collection View synchron halten wollen, müssen Sie diese ebenfalls binden. Zusammengefasst:

  • Binden Sie die Sammlungsansicht Content zum Array Controller, Taste arrangedObjects
  • Binden Sie die Sammlungsansicht Selection Indexes zum Array Controller, Taste selectionIndexes .

Stellen Sie außerdem sicher, dass arrayController festgelegt wurde, bevor Sie einen Beobachter hinzufügen. Die Ausgänge werden garantiert gesetzt in -awakeFromNib und andere Methoden, die nach ihr aufgerufen werden: Wenn Sie einen Fenster-Controller verwenden, können Sie -windowDidLoad Wenn Sie einen View-Controller verwenden, können Sie -loadView ; sonst, -applicationDidFinishLaunching: in Ihrem Anwendungsdelegaten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X