【问题标题】:Make NSSavePanel forget the previous directory让 NSSavePanel 忘记之前的目录
【发布时间】:2013-02-01 06:53:22
【问题描述】:

NSSavePanel 记住之前选择的目录。

如何让它忘记它,并恢复默认值?

我正在使用沙盒应用程序。

【问题讨论】:

  • 默认值最后查看的目录。这就是打开/保存面板的设计方式。为什么你想要一些不同的东西?

标签: macos cocoa appstore-sandbox nssavepanel


【解决方案1】:

/* 要获得一个面板,该面板首先指向 OS X 决定的正确默认值 目录(没有最后保存的)在运行面板之前删除保存在默认值中的所有值: */

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"NSNavLastRootDirectory"];
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"NSNavLastCurrentDirectory"];
[[NSUserDefaults standardUserDefaults] synchronize];

NSSavePanel *savePanel = [NSSavePanel savePanel];

/* 如果您删除了默认值,并且需要将值传递给目录设置 API,并且想要获取“默认”值,请传递 nil。 (但是在沙盒打开/保存面板的生命周期中的某些时候(在它开始运行之后),出于安全考虑,您可能不再被允许更改目录。)如果您不删除默认保存的值并且您将 nil 传递给目录设置 API,您将获得最后使用的值。 */

[savePanel setDirectoryURL:nil];  

【讨论】:

    【解决方案2】:

    每次拨打setDirectoryURL:

    NSSavePanel *savePanel = [NSSavePanel savePanel];
    
    [savePanel setDirectoryURL:[NSURL fileURLWithPath:PATH]];  
    

    [[NSUserDefaults standardUserDefaults] setValue:PATH forKey:@"NSNavLastRootDirectory"];
    [[NSUserDefaults standardUserDefaults] synchronize];  
    

    编辑

    NSSavePanel *savePanel = [NSSavePanel savePanel];
    
    [savePanel setCanChooseFiles:NO];
    [savePanel setCanChooseDirectories:YES];
    if (mDefaultURL) { // memeber variable NSURL *mDefaultURL;
        [savePanel setDirectoryURL:[NSURL fileURLWithPath:mDefaultPath]];
    }
    //
    
    [savePanel beginSheetModalForWindow:self.window completionHandler:^(NSInteger result) {
        if (result == NSFileHandlingPanelOKButton) {
            [self setBaseURL:[openPanel URL]];
            [self setupImagesMenu];
        }
    }];
    NSLog(@"%@", [savePanel directoryURL]);
    if (mDefaultURL==nil) {
        mDefaultURL = [[NSURL alloc] initWithString:[[savePanel directoryURL] path]];
    }
    

    【讨论】:

    • 我告诉@FruityGeek 的事情是一样的。如果我理解正确,您是在告诉我如何做与我想做的相反的事情。
    • 在成员变量中存储默认路径。
    • 怎么获取默认路径,那么(mDefaultURL)?
    • 第一次你会得到[savePanel directoryURL](默认值)。
    【解决方案3】:

    第一次显示面板时,将directoryURL 存储到静态变量中。使用setDirectoryURL 在以后使用保存面板时使用该目录。

    在非沙盒应用中,您可以通过 NSUserDefaults 访问该值。你可能仍然可以。我知道 NSSavePanel 在沙盒应用程序中调用时会被替换,并且它可能不会以相同的方式设置首选项(并且可能会将它们保留在您无法访问的域中)。您可以在 ~/Library/Preferences/com.yourdomain.yourApp.plist 中打开 plist 文件以找到确切的密钥。

    NSSavePanel * savePanel = [[NSSavePanel alloc] init];
    //store default directory prior to displaying save panel to user
    NSURL * defaultDirectory = [savePanel directoryURL];
    
    //Present to user, resetting default directory when done. 
    [savePanel beginSheetModalForWindow:window
                  completionHandler:^(NSInteger result) {
                              [[NSUserDefaults standardUserDefaults] setValue:defaultDirectory forKey:@"NSNavLastRootDirectory"];
                              [[NSUserDefaults standardUserDefaults] synchronize];
                          }];
    

    【讨论】:

    • 如果我理解正确,您是在告诉我如何做与我想做的相反的事情。 NSSavePanel 自己记住最后一个目录。我想将此行为重置为默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-18
    • 2019-01-07
    • 2021-09-12
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    相关资源
    最近更新 更多