【问题标题】:Modal Window in CocoaCocoa 中的模态窗口
【发布时间】:2011-01-01 13:20:32
【问题描述】:

我正在尝试创建一个自定义模式窗口,这是我目前拥有的代码:

NSWindowController *modalSheet = [[NSWindowController alloc]
initWithWindowNibName:@"MyCustomWindow" owner:self];

[NSApp beginSheet:[modalSheet window]
 modalForWindow:[self windowForSheet]
  modalDelegate:nil
 didEndSelector:nil
    contextInfo:nil];

窗口可以正常弹出,但不是模态的,例如您仍然可以对请求来自的父窗口执行操作。这个方法是从一个 NSDocument 对象调用的。

我尝试阅读:Using Custom Sheets

但是我不确定myCustomSheet 是什么,因为它没有在任何地方声明。我假设它是一个 NSWindow 实例变量。

我只是不明白为什么它不是模态的。任何帮助将非常感激。谢谢

【问题讨论】:

    标签: objective-c cocoa nswindow nswindowcontroller cocoa-sheet


    【解决方案1】:

    希望这会有所帮助。 运行你的窗口控制器总是模态的。创建您自己的 NSWindowController 子类并添加这两个方法。

    - (void)windowDidLoad
    {
        [super windowDidLoad];
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{//TODO
            [[NSApplication sharedApplication] runModalForWindow:self.window];
        });
    }
    
    - (void)windowWillClose:(NSNotification *)notification
    {
        [[NSApplication sharedApplication] stopModal];
    }
    

    【讨论】:

      【解决方案2】:

      Apple 的 Window Programming Guide 中有专门针对 Using Modal Windows 的部分,它告诉您几乎所有您应该需要的东西。

      【讨论】:

        【解决方案3】:

        您有没有将worksWhenModal 设置为YES?这将导致正是您描述的行为,因为这就是它的目的。

        关于将面板(您使用的是 NSPanel,对吗?)包装在它自己的窗口控制器中,您不需要这样做。实际上,我只是在没有窗口控制器的情况下制作床单。您需要的窗口控制器中是否有任何自定义逻辑? AppKit 为您处理。

        【讨论】:

        • 不幸的是,没有,在别处阅读,您似乎无法通过 NSWindowController 初始化由 xib 文件创建的窗口。所以我必须弄清楚如何将通过NSBundle加载的xib文件放入NSWindow
        • 您真的需要 XIB 吗?让我感到困扰的是,文档通常使做某事的唯一方法似乎是通过界面构建​​器,而在没有 IB 的情况下制作窗口非常简单。实际上,我只是在没有窗口控制器的情况下制作床单。您需要的窗口控制器中是否有任何自定义逻辑? AppKit 为您处理。
        猜你喜欢
        • 1970-01-01
        • 2010-10-10
        • 2011-11-21
        • 1970-01-01
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多