लागू बिना चलाता है क्यों निम्नलिखित कोड काम करता है? यह एक छोटा कोको प्रोग्राम है जो फ़ाइल चुनने के लिए NSOpenPanel का उपयोग करता है और इसे Emacs.app में खोलता है। इसे प्रारंभिक निर्देशिका के साथ कमांड लाइन से तर्क के रूप में चलाया जा सकता है।कैसे यह है कि कोको जीयूआई कक्षा NSApplication या NSRunLoop
कैसे NSOpenPanel NSApplication या NSRunLoop लागू बिना चलता है? कोको कार्यक्रम पर सीमाएं क्या हैं जो स्पष्ट रूप से एनएसएप्लिकेशन या एनएसआरन लूप शुरू नहीं करती हैं? मैंने सोचा होगा कि उनमें से एक था: आप किसी भी प्रकार की जीयूआई का उपयोग नहीं कर सकते। शायद NSOpenPanel का आह्वान करके, कुछ फ़ॉलबैक कोड को बुलाया जा रहा है जो NSRunLoop को आमंत्रित करता है? मैंने + [एनएसपीप्लिकेशन एलोक] और + [एनएसआरन लूप एलोक] पर ब्रेकपॉइंट लगाए और वे ट्रिगर नहीं हुए।
main.m:
#import <Cocoa/Cocoa.h>
NSString *selectFileWithStartPath(NSString *path) {
NSString *answer = nil;
NSOpenPanel* panel = [NSOpenPanel openPanel];
panel.allowsMultipleSelection = NO;
panel.canChooseFiles = YES;
panel.canChooseDirectories = NO;
panel.resolvesAliases = YES;
if([panel runModalForDirectory:path file:nil] == NSOKButton)
answer = [[[panel URLs] objectAtIndex:0] path];
return answer;
}
int main(int argc, const char * argv[]) {
NSString *startPath = argc > 1 ? [NSString stringWithUTF8String:argv[1]] : @"/Users/Me/Docs";
printf("%s\n", argv[1]);
BOOL isDir;
if([[NSFileManager defaultManager] fileExistsAtPath:startPath isDirectory:&isDir] && isDir) {
system([[NSString stringWithFormat:@"find %@ -name \\*~ -exec rm {} \\;", startPath] UTF8String]);
NSString *file = selectFileWithStartPath(startPath);
if(file) [[NSWorkspace sharedWorkspace] openFile:file withApplication:@"Emacs.app"];
}
}
हाँ, मैं देख रहा हूँ। शीघ्र प्रतिक्रिया के लिए शुक्रिया। एक बात मैं सिर्फ महसूस किया है कि पुराने क्लासिक एप्पल main.m कॉल [NSApplication sharedApplication], नहीं [NSApplication alloc]। मेरा अनुमान है कि कि runModalForWindow करने के लिए कॉल एप्पल पुस्तकालय में एक सिंगलटन [NSApplication sharedApplication] instantiating से पहले हो सकता है। – Colin