NSSavePanel无法更改文件名。

4
在我的 Mac 应用程序中,我正在使用 NSSavePanel - 但它的行为非常奇怪。有时我无法更改文件的默认名称。
我是这样使用它的:
NSSavePanel *savePanel = [NSSavePanel savePanel];
[savePanel setAllowedFileTypes:@[@"jpg"]];
[savePanel setLevel:CGShieldingWindowLevel()];

if([savePanel runModal] == NSFileHandlingPanelOKButton)
{
    //saving file
}

我找不到原因,有时候它允许我更改文件名,有时候却不行。我可以保存文件,但却无法在保存面板中更改名称。

4个回答

1

这不是一个正确的答案,但可能会为问题提供一些线索(我也在努力解决这个问题)。

到目前为止,我发现如果你在调用时没有活动窗口

result = panel.runModal() // swift
NSModalResponse result = [panel runModal]; // Obj-C

然后NSSavePanel的行为就会出现问题,虽然你可以在名称字段中单击,但无法在其中输入(如果尝试则会发出哔声)。

我还发现了一个丑陋的小解决方法。如果允许创建新目录,

    panel.canCreateDirectories = YES;  // Obj-C

按下保存面板中的按钮即可执行此操作 - 一个小表单(又是另一个窗口...)出现在NSSavePanel的顶部,如果您取消并关闭此表单,则可以重新输入名称字段。

由于OP没有提供任何程序场景和环境的描述,但似乎与之相关,因为将窗口级别强制设置为“模态”可以解决他的问题。

在我的情况下(我正在从菜单栏项弹出窗口中打开NSSavePanel。不幸的是,弹出窗口在我的NSSavePanel成功“附加到它”之前就关闭了。手动设置级别。

panel.level = NSWindow.Level.modalPanel // Swift
panel.level = NSModalPanelWindowLevel;  // Obj-C

没有帮助解决问题。


0
你有没有尝试提供一个默认名称?
[savePanel setNameFieldStringValue:@"New File.txt"];

0

Swift 4

let panel = NSSavePanel()
panel.nameFieldStringValue = "filename.txt" // <-- user editable prompt 

if panel.runModal() == NSApplication.ModalResponse.OK, let url = panel.url {
    // use url path here
}

0

这个太奇怪了,但我想分享我的解决方案。如@Rupert Pupkin所描述的那样,我已经使用了nameFieldStringValue,但是NSSavePanel的行为很奇怪,有时候不改变名称,有时候又改变了。所以我看到我没有描述清楚我的NSSavePanel的级别。

savePanel.nameFieldStringValue = "YourFileName"
savePanel.level = NSWindow.Level.modalPanel

这两行代码一起对我有用。
我的当前NSSavePanel代码是这样的:
let savePanel = NSSavePanel()
savePanel.title = "Download File"
savePanel.prompt = "Download"
savePanel.message = "Choose a directory to save your scanned document"
savePanel.nameFieldStringValue = "myfile"
savePanel.level = NSWindow.Level.modalPanel

savePanel.showsTagField = false
savePanel.isExtensionHidden = false
savePanel.canCreateDirectories = true

希望有所帮助!

在我的情况下没有帮助。 - Motti Shneor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接