Problem mit NSTreeController setSelectionIndexPath

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

  • Problem mit NSTreeController setSelectionIndexPath

    Hallo,

    ich habe bei einem Testprojekt ein Problem mit 'nem NSOutlineView bzw. mit dem TreeController. Ich möchte über einen Button die GroupItems aus bzw. einblenden lassen. Dafür habe ich folgende Action geschrieben, welche auch bis auf die Selection funktioniert:

    PHP-Quellcode

    1. - (IBAction)_changeGroupBannerState:(id)sender {
    2. self.tempSelectedObject = [self selectedObject];
    3. NSPredicate *predicate = @"Das fetchen funktioniert, deshalb lass ich den Code der einfachhalt halber mal raus";
    4. [sourceTreeController setFetchPredicate:predicate];
    5. [sourceTreeController fetch:sender];
    6. [sourceViewOutlineView expandItem:nil expandChildren:YES];
    7. //_treeNodeForItem besorgt mir das passende NSTreeNode* Objekt für das jeweilige NSManagedObject*
    8. [sourceTreeController setSelectionIndexPath:[[self _treeNodeForItem:self.tempSelectedObject] indexPath]];
    9. }
    Alles anzeigen
    Das seltsame daran ist, dass die beiden letzten Zeilen expandItem und selectionIndexPath keine Wirkung zeigen. Es wird grundsätzlich das erste Element im NSOutlineView markiert.

    Ich habe dann testweise eine 2. Action geschrieben, mit welcher ich die beiden besagten Code Zeilen direkt nach der ersten Action ausführe: (Durch nen Button klick)

    PHP-Quellcode

    1. - (IBAction)expandAll:(id)sender {
    2. [sourceViewOutlineView expandItem:nil expandChildren:YES];
    3. [sourceTreeController setSelectionIndexPath:[[self _treeNodeForItem:self.tempSelectedObject] indexPath]];
    4. }
    Das interessante ist, dass jetzt das gewünschte Verhalten auftritt obwohl die Aufrufe identisch sind. (tempSelectedObject zeigt immer noch auf dasselbe Objekt)


    Edit: Der einzige Unterschied zwischen den beiden Aufruf-Versuchen ist das Objekt , welches von _treeNodeForItem zurückgegeben wird. Allerdings verweisen die unterschiedlichen NSTreeNode Objekte bei -representedObject beide auf das selbe NSManagedObject. Das wird aber wahrscheinlich auch nicht der Fehler sein, denn das expandItem wird ja auch nicht ausgeführt.

    PHP-Quellcode

    1. - (NSTreeNode *)_treeNodeForItem:(NSManagedObject *)item {
    2. if(!item)
    3. return nil;
    4. NSInteger rows = [sourceViewOutlineView numberOfRows];
    5. NSInteger i;
    6. for(i = 0; i < rows; ++i) {
    7. NSTreeNode *treeNode = [sourceViewOutlineView itemAtRow:i];
    8. if([treeNode representedObject] == item)
    9. return treeNode;
    10. }
    11. return nil;
    12. }
    Alles anzeigen
  • RE: Problem mit NSTreeController setSelectionIndexPath

    Original von Konrad

    PHP-Quellcode

    1. - (IBAction)_changeGroupBannerState:(id)sender {
    2. NSPredicate *predicate = @"Das fetchen funktioniert, deshalb lass ich den Code der einfachhalt halber mal raus";
    3. [sourceTreeController setFetchPredicate:predicate];
    4. }

    Das sieht mir nicht richtig aus. Du erklärst ein NSPredicate, weist dem Objekt einen konstanten NSString zu und setzt den dann als 'predicate' in Deinen Controller.
    Selbst wenn das ein Formatstring sein wäre, nähme man 'predicateWithFormat:'.
    I would be embarrassed if they did not spy on me.
  • Ja das hatte ich einfach mal weggelassen, weil ja die richtigen Objekte angezeigt werden:

    PHP-Quellcode

    1. if([sender state] == NSOnState) {
    2. predicate = [NSPredicate predicateWithFormat:@"entity.name != 'XGroupSourceItem' AND parent != nil"];
    3. [sender setState:NSOffState];
    4. } else {
    5. predicate = [NSPredicate predicateWithFormat:@"parent == nil"];
    6. [sender setState:NSOnState];
    7. }