[SOLVED] :-)
I've succesfully figured out how to add and change the NSButtonCell state in 
the NSOutlineView. I just added a BOOL isChecked to my outlineview Item class
so that I don't need an NSArray, which is much cleaner and I don't need the 
rowIndex: [outlineView rowForItem:item].
Here's my partial code for reference:

OvItem class:

@interface OvItem : NSObject {
    
        NSString *name;
        NSMutableArray *children;
        BOOL isChecked;
    
}

@property (nonatomic, readwrite, retain) NSString *name;
@property (nonatomic, readwrite, retain) NSMutableArray *children;
@property (nonatomic, readwrite, assign) BOOL isChecked;

Then for the outlineView datasource methods:

- (id)outlineView:(NSOutlineView *)outlineView child:(NSInteger)index 
ofItem:(id)item {

    OvItem *node = ((OvItem *)item == nil ? rootNode : (OvItem *)item); 
    return [node.children objectAtIndex:index];
}

- (id)outlineView:(NSOutlineView *)outlineView 
objectValueForTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
    id theValue;
    
     if ( [[tableColumn identifier] isEqualToString:@"instrumentColumn"] )
    {
        theValue = [ (OvItem *)item name];
    }
    else if ( [[tableColumn identifier] isEqualToString:@"buttonColumn"] )
   {
       // Reading the NSButtonCell state value
       // Since NSButtonCell's state is an intValue we convert it to an NSNumber
       theValue = [NSNumber numberWithInt:[(OvItem *)item isChecked]];
    }
    
    return theValue;
}

- (void)outlineView:(NSOutlineView *)outlineView setObjectValue:(id)object 
forTableColumn:(NSTableColumn *)tableColumn byItem:(id)item
{
    // Setting NSButtonCell state in outlineView's buttonColum
    
    if ( [[tableColumn identifier] isEqualToString:@"buttonColumn" ])
    {
        
        if ( [(OvItem *)item isChecked] )
        {   
            [(OvItem *)item setIsChecked:FALSE];
        } 
        else {
            [(OvItem *)item setIsChecked:TRUE];   
        }        
       
        // NSLog(@"item name: %@ | item isChecked: %d ", [(OvItem *)item name], 
[(OvItem *)item isChecked] );
    }
}

Cheers,

Gilles




On Nov 24, 2011, at 6:47 PM, Quincey Morris wrote:

> On Nov 24, 2011, at 05:46 , Gilles Celli wrote:
> 
>> My hierearchical list will not changed or sorted in the 
>> NSoutlineView….that's why I was thinking to use NSArray for the buttons.
> 
> In your scenario -- where the list is "really" flat but displayed 
> hierarchically for esthetic reasons -- the array approach is fine.
> 
>> However if I want to do it correctly, should I add an ivar like BOOL 
>> isChecked to my OvItem class ? So I won't need an NSArray
>> 
>> Like this:
>> 
>> @interface OvItem : NSObject {
>>     
>>      NSString *name;
>>      NSMutableArray *children;
>>      BOOL isGroup;
>>      BOOL isChecked;                 //  For NSButtonCell in the 
>> NSOutlineView
>> }
>> 
>> Do you think this is a better idea than using NSArray ?
> 
> If you're *already* using these OvItem objects, then I'd say it's worth doing 
> this. It makes things a bit clearer when you (or someone else) return to the 
> code in the future. It would probably also allow you to simplify your 
> 'outlineView:objectValueForTableColumn:byItem:' method a bit.
> 
> 

_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

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 arch...@mail-archive.com

Reply via email to