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
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];
}
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];
}];
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
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
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
}
}
}
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
@Cole Powodem nie można znaleźć tej metody jest, ponieważ jest on realizowany przez 'NSSavePanel', która jest' nadklasą NSOpenPanel' użytkownika. +1 – ughoavgfhw
Ah, dziękuje Jesse i @ughoavgfhw. – Cole
To samo dotyczy innych, lepszych sposobów uruchamiania panelu zapisywania lub otwierania, w tym sposobu uruchamiania go jako arkusza. –