2011-10-07 12 views
11

私は、人にファイルを選択するように尋ねるウィンドウを表示しようとしていました。問題は、私が使用しているメソッドが廃止されているとXcodeが訴えていることです。私はclass referenceを見ましたが、 "running panels"セクションの下のものはMac OS 10.6では廃止されました。今使っている別のクラスがありますか?以下に示すようにNSOpenPanel - 廃止予定のものは何ですか?

答えて

25

は、私の知る限りでは、あなたはrunModalメソッドを使用することができます。

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

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

@Cole理由があります。 +1 – ughoavgfhw

+0

ああ、ありがとうJesseと@ughoavgfhw。 – Cole

+1

同じことは、シートとして実行する方法を含め、保存パネルまたは開いたパネルを実行する他の優れた方法にも当てはまります。 –

29

は10.6で、このクラスにいくつかの変更がありました。利点の1つは、現在ブロックベースのAPIがあることです。

ここ

はそれを使用する方法のコードスニペットです:私は6年後にこの質問が有用であることが判明どのように見て

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

これは10.10で使用する正しいコードのようですが、ARCを使用している場合は保持ビットとリリースビットを取り除きます。 – smacdonald

+0

また、[ - beginSheetModalForWindow:completionHandler:](https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/#//apple_ref/occ/instm/NSSavePanel/)を使用することもできます。 beginSheetModalForWindow:completionHandler :)別のダイアログを開かない場合。 – pi3

3

、そして何の迅速な答えは存在しないので、ここでの迅速な解決策です。

スタンドアローンウィンドウとシートの2つのサンプルがあります。それは `NSOpenPanel`のスーパークラスである` NSSavePanel`、によって実装されているので、あなたがこの方法を見つけることができませんでした

スウィフト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

したがって、 '.begin'は補完ハンドラです。将来のon-lookersのために:あなたは以下を行うこともできます: '応答= panel.runModal();応答== NSApplication.ModalResponse.OKの場合{/ * panel.url * /}での処理' '.CANCEL' – eonist

関連する問題