NSOpenPanel&NSSavePanel

NSPanel 的使用

https://github.com/JHiroGuo/JHPanel

NSPanel包含NSOpenPanel文件打開面板和NSSavePanel文件保存面板。是用來提供文件打開路徑選擇 和文件保存路徑選擇的兩種系統樣式。

NSOpenPanel

用於文件打開路徑或者文件保存路徑的選擇

屬性

+(NSOpenPanel *)openPanelWithTitleMessage:(NSString *)ttMessage
                                setPrompt:(NSString *)prompt
                              chooseFiles:(BOOL)bChooseFiles
                        multipleSelection:(BOOL)bSelection
                        chooseDirectories:(BOOL)bChooseDirc
                        createDirectories:(BOOL)bCreateDirc
                          andDirectoryURL:(NSURL *)dirURL
                         AllowedFileTypes:(NSArray *)fileTypes
{
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    [panel setPrompt:prompt]; 	// 設置默認選中按鈕的顯示(OK 、打開,Open ...) 
    [panel setMessage: ttMessage];	// 設置面板上的提示信息
    [panel setCanChooseDirectories : bChooseDirc]; // 是否可以選擇文件夾
    [panel setCanCreateDirectories : bCreateDirc]; // 是否可以創建文件夾
    [panel setCanChooseFiles : bChooseFiles];      // 是否可以選擇文件
    [panel setAllowsMultipleSelection : bSelection]; // 是否可以多選
    [panel setAllowedFileTypes : fileTypes];        // 所能打開文件的後綴
    [panel setDirectoryURL:dirURL];		            // 打開的文件路徑
    
    return panel;
}

 

方法

非模態(劉海)打開方式

  NSOpenPanel *panel = [CustomePanel
                          openPanelWithTitleMessage:@"Choose File" // folder 頂部提示
                                                       setPrompt:@"OK"                      // 文件選擇確認鍵 顯示內容(一般NULL隨系統)
                                                     chooseFiles:YES                        // 是否可以選擇文件(如果爲NO 則只可以選擇文件夾)
                                               multipleSelection:YES                        // 是否可以多選
                                               chooseDirectories:YES                         // 是否可以選擇文件夾
                                               createDirectories:YES                        // 是否可以創建文件夾
                                                 andDirectoryURL:NULL                       // 默認打開路徑(桌面、 下載、...)
                                                AllowedFileTypes:[NSArray arrayWithObjects:@"png",@"jpg",@"bmp", nil] // 所能選擇的文件類型
                          ];
    
    __block NSArray *chooseFiles;
    [panel beginSheetModalForWindow:[NSApp mainWindow] completionHandler:^(NSModalResponse result) {
        if (result == NSModalResponseOK) {
            chooseFiles = [panel URLs];
            NSLog(@"Click OK Choose files : %@",chooseFiles);
        }else if(result == NSModalResponseCancel)
            NSLog(@"Click cancle");
    }];
    
    NSLog(@"Choose files : %@",chooseFiles);
    
--------------------------------------------------------
2019-02-28 15:54:24.466364+0800 JHPanel[1557:21952] Choose files : (null)
2019-02-28 15:54:29.089672+0800 JHPanel[1557:21952] Click OK Choose files : (
    "file:///Users/gjh/Desktop/31111142m4ap.jpg"
)
--------------------------------------------------------    

注意:在非模態打開情況下,當調用 beginSheetModalForWindow 後 會打開面板----->執行 beginSheetModalForWindow下面的代碼,然後當用戶有選擇OK/Cancle的時候 纔會執行completionHandler的Block方法。

模態(彈出)打開方式
 

NSOpenPanel *panel = [CustomePanel openPanelWithTitleMessage:@"Choose File" // folder 頂部提示
                                      setPrompt:@"OK"                      // 文件選擇確認鍵 顯示內容(一般NULL隨系統)
                                    chooseFiles:YES                        // 是否可以選擇文件(如果爲NO 則只可以選擇文件夾)
                              multipleSelection:YES                        // 是否可以多選
                              chooseDirectories:YES                         // 是否可以選擇文件夾
                              createDirectories:YES                        // 是否可以創建文件夾
                                andDirectoryURL:NULL                       // 默認打開路徑(桌面、 下載、...)
                                AllowedFileTypes:[NSArray arrayWithObjects:@"png",@"jpg",@"bmp", nil] // 所能選擇的文件類型
                     ];    
NSLog(@"choose files : %@",[CustomePanel getOpenPanelChooseFiles:panel]);
 
 
+(NSArray *)getOpenPanelChooseFiles:(NSOpenPanel *)panel;

{
    NSArray *select_files;
    NSInteger result = [panel runModal];
    if (result == NSModalResponseOK)
    {
        select_files = [panel filenames]; // 注意[panel Urls]的路徑是 file:///User/GJH/....
        if ([select_files count] == 1)
        {
            NSString * oneFile = [select_files objectAtIndex : 0];
            NSLog(@"SELECT A FILE :%@",oneFile);
            
        }else{
            NSLog(@"SELECT  FILES");
        }
    }
    return  select_files;
}
    
--------------------------------------------------------
2019-02-28 16:01:48.706727+0800 JHPanel[1584:24337] SELECT A FILE :/Users/gjh/Desktop/Image/psb.jpg
2019-02-28 16:01:48.706808+0800 JHPanel[1584:24337] choose files : (
    "/Users/gjh/Desktop/Image/psb.jpg"
)
--------------------------------------------------------    

在模態模式下,當運行 [panel runModal]代碼執行會等待停留在文件選擇Window上等待用戶選擇後纔會執行下面的代碼,如果做WindowMac協同開發,建議使用模態模式打開。

 

NSSavePanel

用於文件文件保存路徑的選擇,注意必須設置User Selected File權限。設置方法
路徑:target –> capabilitys –> file access
設置 user selected file 爲 read/write
否則會報錯 *** Assertion failure in …

屬性

+(NSSavePanel *)savePanelWithTitleMessage:(NSString *)ttMessage
                                setPrompt:(NSString *)prompt
                                 setTitle:(NSString *)title
                           nameFiledValue:(NSString *)fileName
                        createDirectories:(BOOL)bCreateDirc
                   bSelectHiddenExtension:(BOOL)bSelectHiddenExtension
                          andDirectoryURL:(NSURL *)dirURL
                         AllowedFileTypes:(NSArray *)fileTypes
{
    NSSavePanel *panel = [NSSavePanel savePanel];
    [panel setMessage:ttMessage];
    [panel setPrompt:prompt];
    [panel setAllowedFileTypes:fileTypes];
    [panel setCanCreateDirectories : bCreateDirc];
    [panel setCanSelectHiddenExtension : bSelectHiddenExtension];
    [panel setTitle:title];
    [panel setNameFieldStringValue:fileName];
    [panel setDirectoryURL:dirURL];
    
    return panel;
}

方法

模態模式

 NSSavePanel *panel  =  [CustomePanel savePanelWithTitleMessage:@"Save File"
                                  setPrompt:NULL
                           setTitle:@"Save File Panel"
                             nameFiledValue:@"Image"
                          createDirectories:YES
                     bSelectHiddenExtension:YES
                            andDirectoryURL:NULL
                           AllowedFileTypes:[NSArray arrayWithObjects:@"png",@"jpg",@"bmp", nil]];
    
   NSString *savePath = [CustomePanel getSavePanelChooseFiles:panel];
   NSLog(@"Save Path : %@",savePath);
   
+(NSString *)getSavePanelChooseFiles:(NSSavePanel *)panel
{
    NSString *filePath = @"";
    NSInteger result = [panel runModal];
    if (result == NSModalResponseOK)
    {
        filePath = [[panel URL] absoluteString];  //[panel filename] 注意兩個路徑的格式
        NSLog(@"filePath : %@",filePath);
    }else
    {
        NSLog(@"Choose Cancle! ");
    }
    return filePath;
}

--------------------------------------------------------    
2019-02-28 16:15:00.677722+0800 JHPanel[1649:28355] filePath : /Users/gjh/Desktop/Image.png
2019-02-28 16:15:00.677770+0800 JHPanel[1649:28355] Save Path : /Users/gjh/Desktop/Image.png
--------------------------------------------------------    
    

非模態模式

NSSavePanel *panel  =  [CustomePanel savePanelWithTitleMessage:@"Save File"
                                                         setPrompt:NULL
                                                          setTitle:@"Save File Panel"
                                                    nameFiledValue:@"Image"
                                                 createDirectories:YES
                                            bSelectHiddenExtension:YES
                                                   andDirectoryURL:NULL
                                                  AllowedFileTypes:[NSArray arrayWithObjects:@"png",@"jpg",@"bmp", nil]];
    
    __block NSString *chooseFile;
    [panel beginSheetModalForWindow:[NSApp mainWindow] completionHandler:^(NSModalResponse result) {
        if (result == NSModalResponseOK) {
            chooseFile = [[panel URL] absoluteString];
            NSLog(@"Click OK Choose files : %@",chooseFile);
        }else if(result == NSModalResponseCancel)
            NSLog(@"Click cancle");
    }];
    
    NSLog(@"Choose files : %@",chooseFile);
--------------------------------------------------------   
2019-02-28 16:16:25.377756+0800 JHPanel[1649:28355] Choose files : (null)
2019-02-28 16:16:26.322764+0800 JHPanel[1649:28355] Click OK Choose files : file:///Users/gjh/Desktop/Image.png
--------------------------------------------------------       
    

保存彈窗帶圖片

+(NSSavePanel *)savePanelWithAllowedFileTypes:(NSArray *)fileTypes
                              titleMessage:(NSString *)ttMessage
                                 setPrompt:(NSString *)prompt
                         andAccessoryImage:(NSImage *)accessoryImage
{
    NSSavePanel *panel = [NSSavePanel savePanel];
    NSView *accessoryView = [[NSView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
    NSImageView *accessoryImageView = [[NSImageView alloc]initWithFrame:accessoryView.frame];
    accessoryImageView.image = accessoryImage;
    accessoryImageView.wantsLayer = YES;
    accessoryImageView.layer.backgroundColor = [NSColor whiteColor].CGColor;
    [accessoryView addSubview:accessoryImageView];
    [panel setAccessoryView:accessoryView];
    [panel setAllowedFileTypes:fileTypes];
    [panel setCanCreateDirectories : YES];
    return panel;
}


    NSSavePanel *panel  = [CustomePanel
                           savePanelWithAllowedFileTypes:[NSArray arrayWithObjects:@"png",@"jpg",@"bmp", nil] 
                           titleMessage:@"Save File"
                           setPrompt:NULL
                           andAccessoryImage:[NSImage imageNamed:@"QRCode"]];
    [panel runModal];

PS : 模態狀態下都是以彈窗的形式彈出,但是如果有多個擴展屏幕。需要注意彈出的窗體可能和應用程序不在一個窗口上。非模態下彈出窗體都是在應用上以劉海的形式彈出,大需要注意的是,有關Code執行循序的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章