如何通过路径绑定 NSImageView?

Posted

技术标签:

【中文标题】如何通过路径绑定 NSImageView?【英文标题】:How to bind NSImageView by path? 【发布时间】:2015-04-27 21:19:04 【问题描述】:

我有一个包含核心数据对象的表格视图/详细信息的程序。 其中一个属性是图像(它只出现在细节中)。 我认为最好只保存图像文件的路径,而不是图像本身(在我看来,带有图像的核心数据文件比图像大得多,即使仅此而已......)。

由于假设用户将图像拖到图像井中,我认为使用“值路径”(AC.selection.image)将图像井绑定到阵列控制器(AC)是合适的。 然而,这并没有做任何事情(imagewell 接受拖到那里的图像,但当我们更改选择时它会保留在那里)。

在我看来,我可能必须实现一些“值转换器”,但不是那些可用的(NSUnarchiveFromData 和 NSKeyedUnarchiveFromData),因为我已经尝试过这些......

我的这个假设是对的吗?如果是这样,那将是什么价值转换器?这是我必须定义的东西吗?或者这完全不可能?

也许我应该补充一点,我仍在使用 OSX 10.6,因此似乎排除了一些假设......

谢谢

【问题讨论】:

在你的情况下,这是你必须定义的东西——你需要一个自定义的值转换器。真的没有那么多标准的。说到旧版本的 XCode,较新的版本会让您拥有一个 NSImage 属性,该属性不会使用 Binary/Allows External Storage 属性填充到您的 sqlite 存储中...See the high-voted answer here。不确定旧版本。 是的,我知道该文件(本例中为图像文件)可以保留在商店之外,但它似乎只适用于较新的版本(从 10.7 开始,似乎... )。我在 XCode 中也有该选项,但它不起作用。所以我必须深入研究如何定义自定义值转换器。 我也有点不确定这是否可行。 Here 它说 Binding 是只读的(但从 10.3 开始可用,所以它不应该是版本问题)。 啊。如果 AC.selection.*image* 是(例如)一个 NSURL,你会想用 NSURL<->NSImage 转换器绑定到 value。用户拖放后的 NSImage->NSURL 方向将为您提供保存图像的机会......假设。我也有点不确定细节,或者我会回答而不是评论。 是的,你是对的。问题是我保存的是图像而不是路径。我以前试过。我也尝试将其另存为外部,但它没有;如果您检查允许外部存储,我会立即收到错误消息。与此同时,我购买了一些额外的内存来升级到 OSX Lion(我的 MacBook 2006 可以走得更远),然后我想我可以用不同的方式做事。还是谢谢你:) 【参考方案1】:

是的。这是可能的。

    选择图像视图 将其绑定到您的对象控制器。在该值路径字段中,您必须将路径值设置为字符串属性

【讨论】:

我试过了,它不起作用。 (我想字符串属性是指模型属性。)实际上这就是我第一次做的事情。我认为问题在于,正如我在上面的评论中所说,通过链接,按值路径绑定是只读的。同时,我让它与一个常规的打开面板一起工作,使用该绑定(您建议的相同)从商店读回图像。它工作正常,但如果用户可以将图像拖到图像视图中会更好,而不必使用打开的面板......但无论如何谢谢。【参考方案2】:

根据我的经验,“值路径”和“值 URL”绑定只能单向工作,例如,您可以使用它们指定图像视图的内容,但您可以'不要从拖动的图像中提取路径/URL。 The documentation 说“绑定是只读的”,这有点模棱两可,但我相信这就是它所指的。

我最终只使用了一个带有路径的文本框,一个“选择...”按钮,并且图像视图仅作为预览。但是,如果您真的想要“Image Well”功能,我会推荐类似KSImageView(GitHub gist)的东西,它可以从NSPasteboard 中获取路径并存储/重新广播它。这是该功能的主要方法(从NSImageView继承后):

- (void)concludeDragOperation:(id <NSDraggingInfo>)sender 
    NSPasteboard *pboard = sender.draggingPasteboard;
    NSString *plist = [pboard stringForType:NSFilenamesPboardType];

    if (!plist) return;

    NSArray<NSString*> *files =
        [NSPropertyListSerialization propertyListWithData:[plist dataUsingEncoding:NSUTF8StringEncoding]
                                                  options:NSPropertyListImmutable
                                                   format:NULL
                                                    error:NULL];
    if (files.count == 0) return;

    NSDictionary *userInfo = @@"imagePath": files[0];

    [[NSNotificationCenter defaultCenter] postNotificationName:@"KSImageDroppedNotification"
                                                        object:self
                                                      userInfo:userInfo];

【讨论】:

以上是关于如何通过路径绑定 NSImageView?的主要内容,如果未能解决你的问题,请参考以下文章

带有网络图像的 NSCollectionView

如何使用自动布局按比例缩小 NSImageView?

如何在其 contentView 上使用 NSImageView 拖动移动 NSWindow?

NSImageView,用 CMD/CTR+C 复制图片

Swift OSX NSImageView 拖放

将 NSImageView 添加到 NSScrollView