0

我有一个外部编辑器设置,最终用户可以更改设置。由于我想让我的软件变得智能,我想将启动此外部软件的按钮设置为禁用状态,如果软件无效(可能 TextEdit 已移至 Utilities 或其他地方或其他地方出错,任何事情都可能发生,对?)..

// Default setting: /Applications/TextEdit.app

[[NSWorkspace sharedWorkspace] launchApplication: [[NSUserDefaults standardUserDefaults] stringForKey: @"externalapp"]];

我可以做一个简单的测试,证明位置是有效的并且存在,但出于某种原因,我决定走花哨的方式,并开始认为应该有一个测试来测试这个位置是否正确 - 它不需要测试它适用于 TextEdit.app - 因为整个想法是您可以使用几乎任何您想要的编辑器 - 这就是为什么它首先是可定制的 - 但我只想简单检查一下我们不会遇到可能遇到的问题被这个测试避免了。

是的,我知道我应该使用 TextEdit.app 打开一个文件,但我还没有进入那个阶段,所以还没有任何东西可以打开,我稍后会这样做——在这个阶段这就足够了看看这个想法是否有效,我可以做一些测试。但如果有人想分享我可能还没有想到的好想法,我正在倾听。

4

1 回答 1

0

这就是我要求的测试方法..

NSString *fileType = [sharedWorkspace typeOfFile: [[NSUserDefaults standardUserDefaults] stringForKey: @"externalapp"] error:nil];

if (( UTTypeEqual((CFStringRef)fileType, kUTTypeApplication) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationBundle) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationFile) ))
    NSLog(@"Yes - File type is equal to Application");

这是一个正确的变压器实现:

@implementation icalValidTransformer

+ (Class)transformedValueClass { return [NSNumber class]; }
+ (BOOL)allowsReverseTransformation { return NO; }

- (id)transformedValue:(id)value {  
    if (( value == nil ) || ( [[NSApp delegate]sharedWorkspace] == nil ))
        return [NSNumber numberWithBool: NO];

    NSError *fileError = nil;
    NSString *fileType = [[[NSApp delegate] sharedWorkspace] typeOfFile:value error: &fileError];

    if ( fileError != nil )
        return [NSNumber numberWithBool: NO];

    if (( UTTypeEqual((CFStringRef)fileType, kUTTypeApplication) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationBundle) ) || ( UTTypeEqual((CFStringRef)fileType, kUTTypeApplicationFile) ))
        return [NSNumber numberWithBool: YES];

    return [NSNumber numberWithBool: NO];
}

@end

这也是一个非常好的示例,说明如何将 fileError 与 -typeOfFile 一起使用 - 如果出现错误(例如,文件不存在),此禁用的按钮/菜单/您正在使用的任何控件..

于 2012-04-08T10:31:48.387 回答