模态会话需要模态窗口

时间:2012-07-29 22:57:16

标签: cocoa modal-dialog cocoa-sheet

我正在尝试像工作表一样打开一个窗口,使其显示在工具栏下方。我已经使用O'Reilly教程来做到这一点。但是,我可以通过这个错误:模态会话需要模态窗口。

如果我选中“Visible At Launch”,窗口会加载为窗口。

是否检查我得到“模态会话需要模态窗口”错误。

我有一个Window.xib,ProgressModal.xib。

在Window实现文件中,我使用:

-(IBAction)loadProgress:(id)sender{
    [self progressStatus:progressWindow];
}

- (void)progressStatus:(NSWindow *)window {

    [NSApp beginSheet: window
       modalForWindow: mainWindow
        modalDelegate: nil
       didEndSelector: nil
          contextInfo: nil];
    [NSApp runModalForWindow: window];
    [NSApp endSheet: window];
    [window orderOut: self];

}

- (IBAction)cancelProgressScrollView:(id)sender {
    [NSApp stopModal];
}

我可能将ProgressModal.xib设置错误。我有一个NSObject,它有“Window”作为它的类。所有的联系都是通过它完成的。

但同样,它加载窗口只是不会将其作为模态加载。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

将以下内容放在progressStatus方法的第一行:

NSLog(@"%@", window);

如果您看到日志输出为空,那就是原因。

使用XIB创建模态工作表的步骤:

  1. 将面板拖到MainMenu.xib
  2. @property (assign) IBOutlet NSPanel *sheetPanel;文件
  3. 中添加AppDelegate.h {li> @synthesize sheetPanel = _sheetPanel;AppDelegate.m文件中
  4. 将步骤1中创建的MainMenu.xib中面板的新引用插座链接到步骤2中创建的sheetPanel属性。
  5. 使用以下代码显示模态表:

    [NSApp beginSheet:_sheetPanel
       modalForWindow:_mainWindow
        modalDelegate:self
       didEndSelector:@selector(didEndSheet:returnCode:contextInfo:)
          contextInfo:nil];
    

答案 1 :(得分:1)

正如我上面所说,我在progressModal窗口中拖动了一个对象并通过它建立了连接。我应该做的是让File的所有者成为我的Window类。改变这一点解决了问题。

我是从http://www.youtube.com/watch?v=QBkO6TD-fWA

得到的

答案 2 :(得分:0)

编辑:我以为你想要一个模态窗口。如果您需要工作表,请不要使用runModalForWindow:

试试这个:

[NSApp beginSheet: window
   modalForWindow: mainWindow
    modalDelegate: nil
   didEndSelector: nil
      contextInfo: nil];

最好定义一个回调,以防万一你需要它; e.g。

[NSApp beginSheet: window
   modalForWindow: mainWindow
    modalDelegate: self
   didEndSelector: @selector(sheetDidEnd:returnCode:contextInfo:)
      contextInfo: nil];