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
上等待用戶選擇後纔會執行下面的代碼,如果做Window
與Mac
協同開發,建議使用模態模式打開。
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
執行循序的問題。