Kişiye bir dosya seçmesini isteyen bir pencere açmaya çalışıyorum ve sonunda yaptım. Sorun şu ki, Xcode kullanmakta olduğum yöntemin kullanımdan kaldırılmasından şikayet ediyor. class reference'a baktım, ancak "çalışan paneller" bölümünün altındaki her şey Mac OS 10.6'dan itibaren kullanımdan kaldırıldı. Şimdi kullanmam gereken farklı bir sınıf var mı? Aşağıda gösterilen gibiNSOpenPanel - Her şey kullanımdan kaldırıldı mı?
cevap
olarak bildiğim kadarıyla, sen runModal
yöntemi kullanabilirsiniz:
NSOpenPanel *openPanel = [[NSOpenPanel alloc] init];
if ([openPanel runModal] == NSOKButton)
{
NSString *selectedFileName = [openPanel filename];
}
10.6, bu sınıflara birkaç değişiklik yoktu. Avantajlardan biri şu anda blok tabanlı bir API olmasıdır.
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];
}];
Bu, 10.10'un altında kullanmak için doğru kod gibi görünüyor, ancak ARC kullanıyorsanız koru ve bırakma bitlerinden kurtulun. – smacdonald
Alternatif olarak [- beginSheetModalForWindow: completionHandler:] öğesini (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/#//apple_ref/occ/instm/NSSavePanel/ ayrı bir açık iletişim kutusu istemiyorsanız beginSheetModalForWindow: completionHandler :). – pi3
hiçbir hızlı cevaplar olmadığından bu soruyu yararlı altı yıl sonra ve burada hızlı bir çözüm nasıl bulduğunu görünce: Burada
o nasıl kullanılacağı hakkında bir kod parçacığı olduğunu.İki örnek, biri bağımsız bir pencere, diğeri ise bir sayfa olarak bulacaksınız. o `NSOpenPanel` en üst sınıf olan` NSSavePanel` tarafından uygulanır, çünkü bu yöntemi bulamadık
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
}
}
}
Yani '.begin' bir tamamlama işleyicisi. Gelecekte yapılacaklar için: Ayrıca şunları yapabilirsiniz: 'yanıtı ver = panel.runModal(); eğer yanıt == NSApplication.ModalResponse.OK {/ * panel.url ile bir şeyler yap * /}' Ayrıca .CANCEL için de çalışır – eonist
@Cole nedenidir. +1 – ughoavgfhw
Ah, teşekkürler Jesse ve @ughoavgfhw. – Cole
Aynı şey diğeri için doğrudur, bir sayfayı bir sayfa olarak çalıştırma yöntemi de dahil olmak üzere, bir kaydetme veya açık paneli çalıştırmada daha iyi yollar. –