2011-10-07 5 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

아, 감사합니다 제시와 @ughoavgfhw. – Cole

+1

시트를 하나씩 실행하는 방법을 포함하여 저장 또는 열린 패널을 실행하는 다른 방법에 대해서도 마찬가지입니다. –

29

10.6,이 클래스에 몇 가지 변화가 있었다. 이점 중 하나는 블록 기반 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]; 
}]; 
+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

내가 더 신속한 답변이 없기 때문에이 질문은 유용 나중에 6 년, 그리고 여기에 빠른 해결책을 발견하는 방법을 보면 다음과 같습니다

그 사용 방법에 대한 코드입니다.

두 개의 샘플을 찾을 수 있습니다. 하나는 독립 실행 형 윈도우이고 다른 하나는 시트입니다. 그것은`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를 위해서 : 당신은 또한 할 수있다 :'response = panel.runModal(); 응답 == NSApplication.ModalResponse.OK {/ * panel.url * /}으로 할 일'''.CANCEL' – eonist

관련 문제