0

Ich habe eine Einstellung für den externen Editor, den Endbenutzer in den Einstellungen ändern kann. Da ich meine Software schlau machen möchte, möchte ich eine Schaltfläche setzen, die diese externe Software in den deaktivierten Zustand versetzt, wenn Software nicht gültig ist (vielleicht wurde TextEdit in Dienstprogramme verschoben oder anderswo oder irgendetwas anderes schief geht, alles kann passieren, richtig ?) ..So testen Sie eine gültige Anwendung mit NSWorkspace-Startapplikation in Cocoa/Xcode/OBJ-C

// Default setting: /Applications/TextEdit.app 

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

ich konnte nur einen einfachen Test machen, dass Standort gültig ist und existiert, aber aus irgendeinem Grund habe ich beschlossen, die Phantasie Weg zu gehen und kam, dass es zu denken, sollte ein Test sein, dass diese Tests für eine richtige Anwendung - es muss nicht für TextEdit.app getestet werden - weil die ganze Idee ist, dass Sie fast jeden Editor verwenden können, den Sie wollen-- Deshalb ist es in erster Linie anpassbar - aber ich will nur ein einfaches überprüfen Sie, dass wir keine Probleme haben, die durch diesen Test vermieden werden konnten.

Und ja, ich weiß, dass ich TextEdit.app verwenden sollte, um eine Datei zu öffnen, aber ich bin noch nicht in dieser Phase, also wird nichts zum Öffnen erzeugt, ich mache das später - in diesem Phase genug, um zu sehen, dass die Idee funktioniert und ich einige Tests machen kann. Aber ich höre zu, wenn jemand gute Ideen teilen möchte, über die ich vielleicht noch nicht nachgedacht habe.

Antwort

0

Dies ist, wie der Test zu tun, ich wurde gefragt ..

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"); 

Hier ist eine richtige Transformator Implementierung:

@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 

Es ist auch ein sehr schönes Beispiel dafür, wie Fileerror zu verwenden with -typeOfFile - Wenn es einen Fehler gibt (zB Datei existiert nicht), hat diese Schaltfläche/Menü/welches Steuerelement Sie auch benutzt haben.