Я пытался получить окно, чтобы показать, что человек выбирает файл, и я в конце концов это сделал. Проблема в том, что Xcode жалуется, что метод, который я использую, устарел. Я просмотрел ссылку , но все, что было в разделе "Бегущие панели", устарело с Mac OS 10.6. Есть ли другой класс, который я должен использовать сейчас?
NSOpenPanel - Все устарело?
Ответ 1
Насколько я знаю, вы можете использовать метод runModal
, как показано ниже:
NSOpenPanel *openPanel = [[NSOpenPanel alloc] init];
if ([openPanel runModal] == NSOKButton)
{
NSString *selectedFileName = [openPanel filename];
}
Ответ 2
В 10.6 было несколько изменений в этих классах. Одно из преимуществ заключается в том, что теперь существует основанный на блоках API.
Вот фрагмент кода о том, как его использовать:
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];
}];
Ответ 3
Увидев, как я нашел этот вопрос полезным шесть лет спустя, и поскольку нет быстрых ответов, здесь быстрое решение.
Вы найдете два образца, один в качестве отдельного окна, а другой в виде листа.
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
}
}
}