2011-10-07 33 views
11

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

25

olarak bildiğim kadarıyla, sen runModal yöntemi kullanabilirsiniz:

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

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

@Cole nedenidir. +1 – ughoavgfhw

+0

Ah, teşekkürler Jesse ve @ughoavgfhw. – Cole

+1

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. –

29

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]; 
}]; 
+2

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

+0

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

3

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 
     } 
    } 
} 
+0

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

İlgili konular