내 OS X 앱은 사용자가 선택한 디렉토리에 지속적으로 액세스해야합니다. App Sandbox를 켜기 전에 UI에는 데이터 모델에 바인딩하는 value
이있는 NSPathControl이있었습니다. 모델의 데이터 유형은 NSData
이고 바인딩은 NSKeyedUnarchiveFromData
값 변환기를 사용합니다. 그것은 훌륭하게 작동했습니다.샌드 박스 응용 프로그램에서 NSPathControl에 NSWRL을 plist에 바인딩하는 방법은 무엇입니까?
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