2011-10-07 33 views
11

Tôi đã cố gắng để có được một cửa sổ để hiển thị yêu cầu người đó chọn một tập tin, và cuối cùng tôi đã làm. Vấn đề là, Xcode phàn nàn rằng phương pháp tôi đang sử dụng không được chấp nhận. Tôi đã xem trong số class reference, nhưng mọi thứ trong phần "bảng điều khiển đang chạy" đã không được chấp nhận kể từ Mac OS 10.6. Có một lớp học khác mà tôi phải sử dụng bây giờ không?NSOpenPanel - Mọi thứ không được chấp nhận?

Trả lời

25

Theo như tôi biết, bạn có thể sử dụng phương pháp runModal như hình dưới đây:

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

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

@Cole Lý do bạn không thể tìm thấy phương pháp này là bởi vì nó được thực hiện bởi 'NSSavePanel', đó là 'cha NSOpenPanel' của. +1 – ughoavgfhw

+0

Ah, cảm ơn Jesse và @ughoavgfhw. – Cole

+1

Điều tương tự cũng đúng với cách khác, cách tốt hơn để chạy bảng lưu hoặc bảng điều khiển mở, bao gồm phương pháp chạy một trang tính dưới dạng trang tính. –

29

Trong 10,6, đã có một vài thay đổi đến các lớp học này. Một trong những lợi ích là bây giờ có một API dựa trên khối.

Dưới đây là một đoạn mã trên làm thế nào để sử dụng:

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

Có vẻ như đó là mã đúng để sử dụng theo 10.10, nhưng loại bỏ các bit giữ lại và giải phóng nếu bạn đang sử dụng ARC. – smacdonald

+0

Hoặc bạn có thể sử dụng [- beginSheetModalForWindow: completionHandler:] (https://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/#//apple_ref/occ/instm/NSSavePanel/ beginSheetModalForWindow: completionHandler :) nếu bạn không muốn một hộp thoại mở riêng biệt. – pi3

3

Thấy thế nào tôi thấy câu hỏi này hữu ích sáu năm sau, và vì không có câu trả lời nhanh chóng, đây là một giải pháp nhanh chóng.

Bạn sẽ tìm thấy hai mẫu, một mẫu làm cửa sổ độc lập và một mẫu khác làm tờ.

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

Vì vậy, '.begin' là một trình xử lý hoàn thành. Đối với những người xem trong tương lai: Bạn cũng có thể làm: 'let response = panel.runModal(); nếu response == NSApplication.ModalResponse.OK {/ * làm việc với panel.url * /}' Cũng hoạt động cho '.CANCEL' – eonist

Các vấn đề liên quan