12

私はその人にファイルを選択するように求めるウィンドウを表示しようとしていましたが、最終的にはそうしました。問題は、Xcodeが私が使用しているメソッドが非推奨であると文句を言うことです。クラスリファレンスを調べましたが、「実行中のパネル」セクションの下にあるものはすべて、MacOS10.6で非推奨になりました。今使っているはずの別のクラスはありますか?

4

3 に答える 3

30

10.6では、このクラスにいくつかの変更がありました。利点の1つは、ブロックベースの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];
}];
于 2011-12-27T18:07:34.877 に答える
27

私の知る限り、runModal以下のような方法を使用できます。

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

if ([openPanel runModal] == NSOKButton)
{
    NSString *selectedFileName = [openPanel filename];
}
于 2011-10-08T00:01:25.587 に答える
4

6年後、この質問がどのように役立つかを見て、迅速な回答がないため、ここに迅速な解決策があります。

2つのサンプルがあります。1つはスタンドアロンウィンドウとして、もう1つはシートとしてです。

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
        }
    }
}
于 2017-06-30T21:02:17.857 に答える