NSBrowser set images

After much searching in Google, I found that there was no obvious solution to displaying images along with text in an NSBrowser when you are using NSTreeController and bindings to populate the browser.

Part of the problem is that you cannot easily use an NSBrowser delegate if you are also using bindings and an NSTreeController to drive the browser (at least on Mac OS X 10.6). For instance, you are prevented from using the -[NSBrowser browser:willDisplayCell:atRow:row column:column] delegate method to customize the cell presentation as you might do in an NSTableView or NSOutlineView.

I worked around this problem using a custome cell approach. When you bind the Browser’s Content Values binding to the NSTreeController, NSTreeController calls the browser cell’s setObjectValue: method. If you subclass NSBrowserCell and override setObjectValue:, you can assign the cell’s text and image. Here’s my NSBrowserCell subclass:

@interface MyBrowserCell : NSBrowserCell { }

- (void) setObjectValue:(id) value;

@end

@implementation MyBrowserCell

- (void) setObjectValue:(id) value {
    if ([value isKindOfClass:[NSDictionary class]]) {
        [self setStringValue:[value valueForKey:@"name"]];
        [self setImage:[value valueForKey:@"image"]];
    }
    else
        [super setObjectValue:value];
}

@end

Next, you need to configure the NSBrowser to use this cell. The simplest way to accomplish this is with NSBrowser’s setCellClass: method:

[browserView setCellClass:[MyBrowserCell class]];

Finally, you need to make your bindings model return a value that’s appropriate for MyBrowserCell. Here’s my nodel’s value getter method which is bound to the NSBrowser Content Values binding:

- (id) browserValue {
    return [NSDictionary dictionaryWithObjectsAndKeys:
                            [self browserName], @"name",
                            [self browserImage], @"image",
                            nil];
}

Note that you’ll need to make sure that will/didChangeValueForKey messages are sent for browserValue when browserName or browserImage change.

Here’s the result in my application:

SD5 Object Chooser Panel

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值