2011-10-07 15 views
11

मैं व्यक्ति को फ़ाइल चुनने के लिए कहने के लिए एक खिड़की पाने की कोशिश कर रहा हूं, और अंततः मैंने किया। समस्या यह है कि, एक्सकोड शिकायत करता है कि जिस विधि का मैं उपयोग कर रहा हूं उसे बहिष्कृत किया गया है। मैंने class reference में देखा, लेकिन "रनिंग पैनल" अनुभाग के तहत सब कुछ मैक ओएस 10.6 के रूप में बहिष्कृत कर दिया गया है। क्या अब एक अलग वर्ग है जिसका उपयोग मैं कर रहा हूं?NSOpenPanel - सब कुछ बहिष्कृत?

उत्तर

25

जहाँ तक मुझे पता है, आप runModal विधि नीचे दिखाया गया है की तरह उपयोग कर सकते हैं:

NSOpenPanel *openPanel = [[NSOpenPanel alloc] init]; 

if ([openPanel runModal] == NSOKButton) 
{ 
    NSString *selectedFileName = [openPanel filename]; 
} 
+4

@Cole कारण आप इस विधि का नहीं मिल सका क्योंकि यह 'NSSavePanel' है, जो' NSOpenPanel' के सुपर क्लास द्वारा कार्यान्वित किया जाता है। +1 – ughoavgfhw

+0

आह, धन्यवाद जेसी और @Ughoavgfhw। – Cole

+1

एक ही चादर के रूप में चलाने के तरीके सहित, सहेजने या खुले पैनल को चलाने के बेहतर तरीके, दूसरे के बारे में भी सच है। –

29

10,6 में, वहाँ इस वर्गों के लिए कुछ परिवर्तन किया गया था। लाभों में से एक यह है कि अब एक ब्लॉक-आधारित एपीआई है।

NSOpenPanel *panel = [[NSOpenPanel openPanel] retain]; 

// Configure your panel the way you want it 
[panel setCanChooseFiles:YES]; 
[panel setCanChooseDirectories:NO]; 
[panel setAllowsMultipleSelection:YES]; 
[panel setAllowedFileTypes:[NSArray arrayWithObject:@"txt"]]; 

[panel beginWithCompletionHandler:^(NSInteger result){ 
    if (result == NSFileHandlingPanelOKButton) { 

     for (NSURL *fileURL in [panel URLs]) { 
      // Do what you want with fileURL 
      // ... 
     } 
    } 

    [panel release]; 
}]; 
+2

ऐसा लगता है कि यह 10.10 के तहत उपयोग करने के लिए सही कोड है, लेकिन यदि आप एआरसी का उपयोग कर रहे हैं तो बनाए रखने और बिट्स को रिहा करने से छुटकारा पाएं। – smacdonald

+0

वैकल्पिक रूप से आप इसका उपयोग कर सकते हैं [- startSheetModalForWindow: completHandler:] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/#//apple_ref/occ/instm/NSSavePanel/ startSheetModalForWindow: completHandler :) यदि आप एक अलग खुला संवाद नहीं चाहते हैं। – pi3

3

देखकर मैं कैसे पाया इस सवाल उपयोगी छह साल बाद, और के बाद से वहाँ कोई तेजी से उत्तर दिए गए हैं, यहाँ एक तेज समाधान है:

यहाँ का उपयोग कैसे उस पर एक कोड स्निपेट है।

आपको दो नमूने मिलेंगे, एक स्टैंड स्टैंड विंडो के रूप में और दूसरा शीट के रूप में।

स्विफ्ट 3,0

func selectIcon() { 
    // create panel 
    let panel = NSOpenPanel() 

    // configure as desired 
    panel.canChooseFiles = true 
    panel.canChooseDirectories = false 
    panel.allowsMultipleSelection = false 
    panel.allowedFileTypes = ["png"] 

    // *** ONLY USE ONE OF THE FOLLOWING OPTIONS, NOT BOTH *** 

    // ********************** OPTION 1 *********************** 
    // use this if you want a selection window to display that is 
    // displayed as a separate stand alone window 
    panel.begin { [weak self] (result) in 
     guard result == NSFileHandlingPanelOKButton, panel.urls.isEmpty == false, let url = panel.urls.first else { 
      return 
     } 

     let image = NSImage.init(contentsOf: url) 
     DispatchQueue.main.async { 
      self?.iconImageView.image = image 
     } 
    } 

    // ********************** OPTION 2 ***********************   
    // use this if you want a sheet style view that displays sliding 
    // down from your apps window 
    panel.beginSheetModal(for: self.view.window!) { [weak self] (result) in 
     guard result == NSFileHandlingPanelOKButton, panel.urls.isEmpty == false, let url = panel.urls.first else { 
      return 
     } 

     let image = NSImage.init(contentsOf: url) 
     DispatchQueue.main.async { 
      self?.iconImageView.image = image 
     } 
    } 
} 
+0

तो '.begin' एक पूरा करने वाला हैंडलर है। भावी ऑन-लुकर्स के लिए: आप यह भी कर सकते हैं: 'प्रतिक्रिया दें = panel.runModal(); अगर प्रतिक्रिया == NSApplication.ModalResponse.OK {/ * panel.url * /} के साथ चीजें करें' 'कैंसल' के लिए भी काम करता है – eonist

संबंधित मुद्दे