Search code examples
objective-ccocoamacosnsoutlineviewnstreecontroller

NSOutlineView -- combining multiple sources


In my app, I have an NSOutlineView that gets its data from a NSTreeController -- which in turn gets it from the Core Data model.

What I would like to do now is to add group headings and maybe some additional rows to the outline view -- obviously things that should exist outside of the model and be part of the view. But, as much as I scratch my head over this, I can't think of any way to make the outline view display these things without modifying the underlying model, which is obviously a big no-no.

Your help is very appreciated. I feel like I am missing something obvious here...


Solution

  • What you would do here is to write a custom NSTreeController subclass. Here is why this is the perfect place for the changes you want to do:

    • It's not in the model, as you said.
    • Has nothing to do with the view -- completely transparent.
    • Basically what you want is to create displayed data out of saved data <- this is a controller's task.

    Luckily, the Controller classes in Cocoa are very powerful and very simple at the same this. For you it should be enough to override the -arrangedObjects method. Re-use the default implementation, as it does a lot of useful things like applying predicates or sorting. Here's how this could look like:

    - (id)arrangedObjects {
      id root = [super arrangedObjects];
    
      // "root" is something like a NSTreeNode but not quite yet
      NSTreeNode *newRoot = [NSTreeNode treeNodeWithRepresentedObject: nil];
      [[newRoot mutableChildNodes] setArray: [root childNodes]];
    
      // Do your customizations here
    
      return newRoot;
    }
    

    The returned object is of the class NSTreeNode - see the documentation on how to do modifications.