You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Objective-C中模态Sheet显示时NSheet控制器未执行问题求助

解决MyWindowController作为模态Sheet未执行代码的问题

看起来你遇到的核心问题是没有正确实例化自定义的MyWindowController类,而是用了基类NSWindowController,导致XIB关联的控制器逻辑完全没被触发。下面一步步帮你排查修复:

1. 修正控制器实例化代码

你当前的初始化代码犯了一个关键错误:用NSWindowController基类去初始化,而不是你自定义的MyWindowController。这就导致XIB里关联的自定义控制器逻辑根本不会被调用。

把这段代码:

MyWindowController = [[NSWindowController alloc] initWithWindowNibName:@"MyWindowController"];

改成:

// 注意变量名符合OC规范,首字母小写
MyWindowController *mySheetController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];

同时要把这个控制器对象保存为强引用属性(比如在主窗口控制器的头文件里声明),避免被ARC提前释放:

// 主窗口控制器头文件
@property (strong, nonatomic) MyWindowController *mySheetController;

// awakeFromNib中初始化
self.mySheetController = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowController"];

2. 验证XIB的File's Owner配置

打开MyWindowController.xib,做两个关键检查:

  • 选中左侧的File's Owner,在右侧Identity Inspector(第三个标签)里,确认Class设置为MyWindowController,而不是默认的NSWindowController
  • 确保File's Owner的window outlet已经连接到XIB里的窗口对象(拖线连接即可)

3. 检查控制器生命周期方法

在MyWindowController里添加调试用的生命周期方法,确认控制器是否被正确初始化:

- (void)awakeFromNib {
    [super awakeFromNib];
    NSLog(@"MyWindowController awakeFromNib 触发");
}

- (void)windowDidLoad {
    [super windowDidLoad];
    NSLog(@"MyWindowController windowDidLoad 触发");
}

如果Sheet弹出后控制台没有这些日志,说明控制器实例化还是有问题,回到第一步重新检查。

4. 完善模态Sheet的调用代码

确保你调用beginSheet时参数完整,并且使用的是自定义控制器的窗口:

[NSApp beginSheet:self.mySheetController.window
       modalForWindow:self.window
        modalDelegate:nil
       didEndSelector:nil
          contextInfo:nil];

如果需要处理Sheet关闭后的逻辑,可以补充实现didEndSelector:

// 主窗口控制器中添加处理方法
- (void)sheetDidClose:(NSWindow *)sheet returnCode:(NSInteger)returnCode contextInfo:(void *)contextInfo {
    [sheet orderOut:nil];
    // 这里添加Sheet关闭后的业务逻辑
}

// 调用时修改参数
[NSApp beginSheet:self.mySheetController.window
       modalForWindow:self.window
        modalDelegate:self
       didEndSelector:@selector(sheetDidClose:returnCode:contextInfo:)
          contextInfo:nil];

5. 排查内存释放问题

如果控制器被提前释放,也会导致代码不执行。务必确保mySheetController是强引用属性(用strong修饰),而不是局部变量或者弱引用。

按照以上步骤调整后,你的MyWindowController应该能正常执行代码,模态Sheet也能按预期工作了。

内容的提问来源于stack exchange,提问作者Lor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:10:34