Cocoa 通过控件编辑NSImageView时更改其值

Cocoa 通过控件编辑NSImageView时更改其值,cocoa,nsimageview,Cocoa,Nsimageview,我有一个NSImageView,它被设置为可编辑。我想能够恢复到默认图像时,用户删除图像。我已尝试在setter中更改NSImageView绑定到的值,但之后不会调用getter,因此NSImageView为空,尽管绑定值被设置为另一个图像。下面是setter代码: -(void)setCurrentDeviceIcon:(NSImage *)newIcon { [self willChangeValueForKey:@"currentDeviceIcon"]; if(newIc

我有一个NSImageView,它被设置为可编辑。我想能够恢复到默认图像时,用户删除图像。我已尝试在setter中更改NSImageView绑定到的值,但之后不会调用getter,因此NSImageView为空,尽管绑定值被设置为另一个图像。下面是setter代码:

-(void)setCurrentDeviceIcon:(NSImage *)newIcon {
    [self willChangeValueForKey:@"currentDeviceIcon"];
    if(newIcon == nil)
        newIcon = [currentDevice defaultHeadsetIcon];
    currentDeviceIcon = newIcon;
    [self setDeviceChangesMade:YES];
    [self didChangeValueForKey:@"currentDeviceIcon"];   
}

我应该如何使NSImageView更新其值?

您不需要在setter方法中发送自己的
willChangeValueForKey:
didChangeValueForKey:
消息。当某个对象开始观察您的
currentDeviceIcon
属性时,KVO包装您的setter方法,以便在某个对象向您发送
setCurrentDeviceIcon:
消息时自动发布这些通知

因此,该方法应如下所示:

-(void)setCurrentDeviceIcon:(NSImage *)newIcon {
    if(newIcon == nil)
        newIcon = [currentDevice defaultHeadsetIcon];
    currentDeviceIcon = newIcon;
    [self setDeviceChangesMade:YES];
}
然后您需要发送此对象
setCurrentDeviceIcon:
消息来更改属性的值。除了此方法和
init
dealloc
(在后两种情况下,您通常不应向自己发送任何其他消息),不要直接分配给
currentDeviceIcon
实例变量


如果这不适用于您,则可能是图像视图未绑定,或者它绑定到了错误的对象。你是怎么装订的?您可以发布绑定检查器的代码/屏幕截图吗?

为什么您可以使用选择器查看
NSImageview
范例


这里
NSArrayController
是您的阵列控制器名称。

对,这似乎仍然不起作用。我非常确定绑定是好的(SS附加到原始帖子以防万一)。我想我可能有点不清楚-当通过控制器更改图像时,控件工作得很好,这是因为nsimageview允许用户在聚焦时按delete键,并且图像将设置为nil。程序会调用setter,但不会调用getter。哦,我明白了。很抱歉我的误解。
-(IBAction)setImage:(id)sender
{
    NSString *icon_path = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle]resourcePath],@"default_icon.png"];
    NSData *imgdata = [NSData dataWithContentsOfFile:icon_path];
    [[[self NSArrayController] selection] setValue:imgdata forKeyPath:@"currentDeviceIcon"];
}