2011-10-07 9 views
11

Próbowałem otworzyć okno, prosząc osobę, aby wybrała plik, i ostatecznie to zrobiłem. Problem polega na tym, że Xcode skarży się, że metoda, której używam, jest przestarzała. Spojrzałem na numer class reference, ale wszystko w sekcji "uruchomione panele" zostało wycofane z wersji Mac OS 10.6. Czy jest inna klasa, której powinienem teraz używać?NSOpenPanel - Wszystko przestarzałe?

Odpowiedz

25

O ile wiem, można użyć metody runModal jak pokazano poniżej:

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

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

@Cole Powodem nie można znaleźć tej metody jest, ponieważ jest on realizowany przez 'NSSavePanel', która jest' nadklasą NSOpenPanel' użytkownika. +1 – ughoavgfhw

+0

Ah, dziękuje Jesse i @ughoavgfhw. – Cole

+1

To samo dotyczy innych, lepszych sposobów uruchamiania panelu zapisywania lub otwierania, w tym sposobu uruchamiania go jako arkusza. –

29

W 10,6, było kilka zmian do tej klasy. Jedną z korzyści jest to, że istnieje teraz blokowy interfejs API.

Oto fragment kodu, w jaki sposób korzystać z tego:

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

Wygląda na to, że jest to prawidłowy kod do użycia pod 10.10, ale pozbywaj się bitów zatrzymywania i zwalniania, jeśli używasz ARC. – smacdonald

+0

Alternatywnie możesz użyć [- beginSheetModalForWindow: completionHandler:] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/#//apple_ref/occ/instm/NSSavePanel/ beginSheetModalForWindow: completionHandler :) jeśli nie chcesz osobnego otwartego okna dialogowego. – pi3

3

Widząc jak znalazłem to pytanie użyteczne sześć lat później, a ponieważ nie ma swift odpowiedzi, oto szybki rozwiązanie.

Znajdziesz dwie próbki, jedną jako samodzielne okno, a drugą jako arkusz.

Swift 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

Tak więc '.begin' jest programem obsługi zakończenia. Dla przyszłych widzów: Możesz również wykonać: 'let response = panel.runModal(); jeśli odpowiedź == NSApplication.ModalResponse.OK {/ * rób rzeczy z panel.url * /}' Działa również dla '.CANCEL' – eonist