如何通过路径绑定 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?的主要内容,如果未能解决你的问题,请参考以下文章