MacOS 开发 - NSOpenPanel & NSSavePanel 保存文件、打开文件夹

本文详细介绍了在MacOS环境下如何使用NSSavePanel和NSOpenPanel进行文件保存和打开操作。涵盖了权限设置、常用属性配置及不同OS版本的调用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、NSSavePanel

1、需要设置权限

路径:target --> capabilitys --> file access
设置 user selected fileread/write

在这里插入图片描述


如果不设置,会报错:
file access error


1.1 示例:打开文件夹,并保存图片到文件夹:
    NSSavePanel *panel = [NSSavePanel savePanel];
    panel.title = @"保存图片";
    [panel setMessage:@"选择图片保存地址"];//提示文字
    
    [panel setDirectoryURL:[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Pictures"]]];//设置默认打开路径
    
    [panel setNameFieldStringValue:picName];
    [panel setAllowsOtherFileTypes:YES];
    [panel setAllowedFileTypes:@[@"jpg",@"png"]];
    [panel setExtensionHidden:NO];
    [panel setCanCreateDirectories:YES];

    [panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){
        if (result == NSModalResponseOK)
        {
            NSString *path = [[panel URL] path];
            NSData *tiffData = [self.imgView.image TIFFRepresentation];
            [tiffData writeToFile:path atomically:YES];
        }
    }];
    

效果图如下:
NSSavePanel

可见,设置title不会显示;


panel 中加一个 block

// 申明 block 
typedef void (^BlockDidSelectPath)(NSString *path);

...

// openPanel 

- (void)saveFileWithFileName:(NSString *)fileName blockDidSelectPath:(BlockDidSelectPath)blockDidSelectPath;{
    
    NSSavePanel *panel = [NSSavePanel savePanel];
    panel.title = @"保存图片";
    [panel setMessage:@"选择图片保存地址"];//提示文字
    
//    [panel setDirectoryURL:[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Pictures"]]];//设置默认打开路径
    [panel setDirectoryURL:[NSURL fileURLWithPath:[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]]];//设置默认打开路径
    
//    NSString *fileName = @"1001.txt";
    [panel setNameFieldStringValue:fileName];
    [panel setAllowsOtherFileTypes:YES];
    [panel setAllowedFileTypes:@[@"txt",@"md"]];
    [panel setExtensionHidden:NO];
    [panel setCanCreateDirectories:YES];

    [panel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result){
        if (result == NSModalResponseOK)
        {
        NSString *path = [[panel URL] path];
        blockDidSelectPath(path);
             
    }];
    

    
}
// 调用
- (void)test1{
 NSString *fileName = @"";
    [self saveFileWithFileName:fileName blockDidSelectPath:^(NSString *path) {
        NSString *content = @"你好";
        NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
        [data writeToFile:path atomically:YES];
        
    }];
   }

二、NSOpenPanel

1、常用的属性

在begin之前设置好即可

  • CanChooseDirectories 是否可以选择目录
  • AllowsMultipleSelection 是否允许多选
  • AllowedFileTypes 允许选择的文件类型,如果都可以的话,就写nil
  • DirectoryURL 默认打开的路径
  • Prompt 默认的“打开”那两个字可以改变

2、调用示例

在按钮点击方法中,调用下面方法:

2.1 OS X 6之后
- (void)pickFile{
    
    NSOpenPanel* panel = [NSOpenPanel openPanel];
    
    [panel setAllowsMultipleSelection:YES];  //是否允许多选file
    
    [panel beginWithCompletionHandler:^(NSInteger result) {
        if (result == NSOKButton) {
            NSMutableArray* filePaths = [[NSMutableArray alloc] init];
            for (NSURL* elemnet in [panel URLs]) {
                [filePaths addObject:[elemnet path]];
            }
            
            NSLog(@"filePaths : %@",filePaths);
        }
        
    }];
}


2.2 OS X 6之前
- (void)openFinder{
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    
	    [panel setCanChooseFiles:YES];  //是否能选择文件file
    
	    [panel setCanChooseDirectories:YES];  //是否能打开文件夹
    
	    [panel setAllowsMultipleSelection:YES];  //是否允许多选file
    
    NSInteger finded = [panel runModal];   //获取panel的响应
    
    if (finded == NSFileHandlingPanelOKButton) {
        
        //   NSFileHandlingPanelCancelButton	= NSModalResponseCancel; NSFileHandlingPanelOKButton	= NSModalResponseOK,
        
        for (NSURL *url in [panel URLs]) {
            
            NSLog(@"文件路径--->%@",url);
            //同时这里可以处理你要做的事情 do something
            
        }
    }
}

保存文件可使用 NSSavePanel


三、参考资料:

NSBeidou:http://www.jianshu.com/p/9a413adbd9b8

出现这个错误的原因是在导入seaborn包时,无法从typing模块中导入名为'Protocol'的对象。 解决这个问题的方法有以下几种: 1. 检查你的Python版本是否符合seaborn包的要求,如果不符合,尝试更新Python版本。 2. 检查你的环境中是否安装了typing_extensions包,如果没有安装,可以使用以下命令安装:pip install typing_extensions。 3. 如果你使用的是Python 3.8版本以下的版本,你可以尝试使用typing_extensions包来代替typing模块来解决该问题。 4. 检查你的代码是否正确导入了seaborn包,并且没有其他导入错误。 5. 如果以上方法都无法解决问题,可以尝试在你的代码中使用其他的可替代包或者更新seaborn包的版本来解决该问题。 总结: 出现ImportError: cannot import name 'Protocol' from 'typing'错误的原因可能是由于Python版本不兼容、缺少typing_extensions包或者导入错误等原因造成的。可以根据具体情况尝试上述方法来解决该问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [ImportError: cannot import name ‘Literal‘ from ‘typing‘ (D:\Anaconda\envs\tensorflow\lib\typing....](https://blog.csdn.net/yuhaix/article/details/124528628)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

富婆E

请我喝杯伯爵奶茶~!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值