This is how I solved it. I my OutlineViewController, I created an array with
the static items names:
topLevelGroups = [[NSArray arrayWithObjects:@"LIBRARY", @"FAVORITES", nil]
retain];
And then create the entities for these names:
for (NSString *name in topLevelGroups)
{
[MyOutlineGroup groupWithName: [name uppercaseString]
inManagedObjectContext:[[NSApp delegate] managedObjectContext]];
}
I also created a convenience method to test if an item is a topLevelGroup:
- (BOOL) isToplevelItem: (id) item
{
MyOutlineGroup *group = (IMyOutlineGroup*) [item representedObject];
return ([topLevelGroups containsObject: group.name]);
}
Then in the NSOutlineView delegate methods, I call:
-(BOOL) outlineView : (NSOutlineView *) outlineView isGroupItem:(id)item
{
return [self isToplevelItem: item];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView
shouldShowOutlineCellForItem:(id)item
{
return [self isToplevelItem: item];
}
- (BOOL)outlineView:(NSOutlineView *)outlineView shouldSelectItem:(id)item
{
return ![self isToplevelItem: item];
}
- Koen.
On Oct 14, 2011, at 2:51 PM, Quincey Morris wrote:
> On Oct 14, 2011, at 09:24 , Koen van der Drift wrote:
>
>> I’m trying to find out how to create the grayish, static items in an
>> NSOutlineView, eg “Library” in iTunes or “Mailboxes” in Mail.
>> Sometimes they have a disclosure triangle, eg "Devices" in the Finder.
>> I think I need to subclass NSCell to change the font, etc.
>
> Subclassing isn't necessary. This is how "group" rows appear in an outline
> view with the "source list" display style. You use delegate methods to
> customize the exact appearance: 'outlineView:isGroupItem:' indicates a group
> item; 'outlineView:shouldShowOutlineCellForItem:' suppresses the disclosure
> triangle on those rows. There may be other methods you need to use to get
> exactly the horizontal and vertical spacing of the iTunes list -- I forget
> the details.
>
>> But I am
>> not sure how to identify these, would an attribute “isStaticItem” for
>> my Group Entity or something like that be a good approach?
>>
>> Secondly, are they part of the NSOutlineView, and the underlying
>> NSTreeController and CoreData model? Just like in the abovementioned
>> examples, these items are already present when the app is started up
>> the first time, so if they are part of the core data model, they must
>> be created programmatically at first, and become part of the model
>> once the user starts adding folders and items. So if the app doesn’t
>> find a database, it will create the starting list. Again, is this the
>> correct approach?
>
> One way to do this is to set up an "intermediate" data model for your list,
> since the structure of the list doesn't match the structure of your actual
> data model. When I do this, I typically define a ListItem class -- a subclass
> of NSTreeNode is easiest, since you'll likely want to follow parent/child
> relationships for various reasons -- with a "representedObject" property that
> can be set to various things -- a string, for header items, or a Core Data
> object for detail rows.
>
> Thus you end up with a tree structure of ListItem objects, which you can then
> feed to the outline view either via your data source or via bindings.
>
> Incidentally, since this tree structure exists only to service the outline
> view, the proper place to create it is in the outline view's window's window
> controller. It's basically glue code, so you definitely don't want to expose
> it to the rest of your app.
>
>
_______________________________________________
Cocoa-dev mailing list ([email protected])
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com
This email sent to [email protected]