如何以模态方式打开NSOpenPanel(因为我打开现有工作表)

时间:2013-02-27 11:15:25

标签: objective-c macos cocoa

我有一个NSPanel,我需要将文件路径加载到其中一个字段中。

我目前正在使用:

NSOpenPanel *browsePanel = [[NSOpenPanel alloc] init];
[browsePanel setCanChooseFiles:YES];
[browsePanel setCanChooseDirectories:NO];
[browsePanel setCanCreateDirectories:NO];
[browsePanel beginSheetForDirectory:nil
                               file:nil
                              types:nil
                     modalForWindow:[self window]
                      modalDelegate:self
                     didEndSelector:@selector(browsePanelPanelDidEnd:returnCode:contextInfo:)
                        contextInfo:[NSNumber numberWithInteger:[sender tag]]
 ]; 

但是NSOpenPanel表没有显示,我在控制台中没有收到任何错误消息。 我想这是因为我从现有的纸张打开它,每次加载不超过1张。

所以我现在正在使用[browsePanel makeKeyAndOrderFront:[self window]];但是我遇到了两个问题:

  1. 面板总是在我的模态表的背面,我无法在顶部显示。此外,我无法移动原始工作表上的焦点。

  2. 如果我没有以模态方式加载数据,如何指定结束选择器来处理数据?

  3. 由于

3 个答案:

答案 0 :(得分:0)

您正在使用:

- (void)beginSheetForDirectory:(NSString *)path file:(NSString *)name types:(NSArray *)fileTypes modalForWindow:(NSWindow *)docWindow modalDelegate:(id)delegate didEndSelector:(SEL)didEndSelector contextInfo:(void *)contextInfo NS_DEPRECATED_MAC(10_0, 10_6);

不推荐使用哪个。你应该使用

[browsePanel beginSheetModalForWindow:self.window completionHandler:nil];

编辑:

Check this running project

答案 1 :(得分:0)

每个窗口一张。更多工作表意味着更多的窗口和奇怪的UI。

答案 2 :(得分:0)

来自Presenting a Series of Sheets

  

Cocoa不支持级联或嵌套工作表的概念。根据 Apple人机界面指南,“当用户响应工作表,并打开该文档的另一个工作表时,第一个工作表必须在第二个工作表打开之前关闭。”

该文档继续告诉您如何呈现系列的工作表,因为第二个打开它会关闭第一个,等等。

您需要采用这样的系列或更改您的设计,以便您的第一张纸,即NSOpenPanel的纸张,根本不是纸张。

仅供参考:在沙盒世界中NSOpenPanel是一个非常不同的野兽,同时保持基本相同的用户界面。其中的变化是NSOpenPanel不再是NSWindow的子类...现在使用NSOpenPanel可能会玩的技巧可能会崩溃并在沙盒下燃烧,轻轻一点。