如何绑定到NSPopUpButtonCell的Image属性?

时间:2013-12-04 06:09:03

标签: objective-c cocoa

我创建了NSTableView,并设置了所有绑定(通过NSArrayController)。我希望其中一列有NSPopUpButtonCell,但是,我希望它显示图像,而不是显示文字 - 因此用户可以更改popup control中的图像。

我的列被绑定(使用SelectedObject绑定)到正确的属性,并且NSPopUpButtonCell被绑定(使用ContentValues绑定)到我的完整图像列表(其中来自另一个包含图像名称数组的NSArrayController - NSStrings。

我创建了一个NSValueTransformer来将图像名称(NSString)转换为NSImage,并通过创建一个带有NSImageCell的添加列来测试它,并正确显示图像。

有办法做到这一点吗?

我希望我可以在NSPopUpButtonCell的{​​{1}}属性上定位绑定,而不是image属性。

编辑:我曾尝试使用带有嵌入式图像的title。但问题仍然存在,因为我希望绑定使用NSAttributedString,而不是setAttributedTitle

1 个答案:

答案 0 :(得分:0)

经过大量的反复试验,我成功地解决了这个问题。我确信仍然存在更强大的正确解决方案,但是,现在,这样做了。

我的解决方案:

  • 更改弹出按钮单元>菜单到自定义类
    • Menu
    • Custom Class
  • 在自定义类中,继承自NSMenu:
    • @interface RSMenu : NSMenu
  • 覆盖insertItemWithTitle,并根据自己的需要进行自定义。

例如:

-(NSMenuItem *)insertItemWithTitle:(NSString *)aString 
        action:(SEL)aSelector 
        keyEquivalent:(NSString *)charCode 
        atIndex:(NSInteger)index {

    NSImage *image = [NSImage imageNamed:aString];
    NSMenuItem* menuItem = [super insertItemWithTitle:image ? @"" : aString 
            action:aSelector 
            keyEquivalent:charCode atIndex:index];

    if ( nil != image ) {
        [menuItem setImage:image];
    }   

    return menuItem;
}

结果如下:

  • Result

希望这有助于其他人。