我的 OS X 应用程序需要持久访问用户选择的目录。在我打开应用沙箱之前,UI 有一个 NSPathControlvalue
绑定到数据模型。模型中的数据类型是NSData
,并且绑定使用了NSKeyedUnarchiveFromData
值转换器。效果很好。
打开应用程序沙盒后,这显然会失败,因为 NSURL 不是安全范围。为了解决这个问题,我用NSKeyedUnarchiveFromData
自己的变压器替换了绑定中的变压器,如下所示。
不幸的是,它并不总是正常工作。有时,当我(作为用户)从 NSPathControl 中选择一个文件时,transformedValue:
即使传递给它的 NSData 参数不是 nil,也会返回 nil。换句话说,NSURL 不解析书签数据。有人知道这里发生了什么吗?当它失败时,返回的错误URLByResolvingBookmarkData:options:relativeToURL:bookmarkDataIsStale:error:
是
错误域 = NSCocoaErrorDomain 代码 = 259 “文件无法打开,因为它的格式不正确。”
@implementation URLFromBookmarkDataTransformer
+ (BOOL)allowsReverseTransformation {
return YES;
}
+ (Class)transformedValueClass {
return [NSURL class];
}
- (id)transformedValue:(id)value {
if (value == nil) {
return nil;
}
NSAssert([value isKindOfClass:[NSData class]], @"value must be NSData");
return [NSURL URLByResolvingBookmarkData:value options:NSURLBookmarkResolutionWithSecurityScope relativeToURL:nil bookmarkDataIsStale:NULL error:NULL];
}
- (id)reverseTransformedValue:(id)value {
if (value == nil) {
return nil;
}
NSAssert([value isKindOfClass:[NSURL class]], @"value must be NSURL");
return [value bookmarkDataWithOptions:NSURLBookmarkCreationWithSecurityScope includingResourceValuesForKeys:nil relativeToURL:nil error:NULL];
}
@end