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的windowoutlet已经连接到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
相关产品推荐
相关产品推荐

