如何确定NSWindowController实例控制的窗口?加载NIB后window返回0
嘿,这个问题我之前也碰到过,其实核心原因大多是NIB里的Outlet没接对,或者初始化方式的小细节没注意到~我给你捋几个关键排查点和解决方法:
检查NIB里的Outlet连接
打开你的NIB文件,先把File's Owner的类设置为你的NSWindowController子类,然后找到里面的NSWindow对象,把它拖到File's Owner的windowOutlet上,确保这个连接是存在的。这一步是核心——要是Outlet没连,控制器根本不知道自己要控制哪个窗口,自然返回nil。调整初始化方法的owner参数
当你调用initWithWindowNibPath:owner:时,如果owner参数传的不是控制器自己,NIB里的窗口不会自动关联到控制器的window属性。推荐的做法是让控制器自己做owner:MyWindowController *controller = [[MyWindowController alloc] initWithWindowNibPath:@"MyWindowNib" owner:controller];或者更简单,直接用
initWithWindowNibName:(如果NIB在主bundle里),这个方法默认让控制器自己当owner,会自动处理Outlet连接:MyWindowController *controller = [[MyWindowController alloc] initWithWindowNibName:@"MyWindowNib"];确认窗口是否已经加载
如果控制器的窗口还没被触发加载(比如你还没调用[controller showWindow:nil]),window属性也可能是nil。你可以手动触发加载,比如直接调用showWindow:方法,之后再访问window属性试试;或者直接调用[controller window],这个调用本身会触发NIB的加载流程。
另外补充一点:Apple文档里说的“接收者拥有的窗口”,前提是控制器和窗口已经通过Outlet正确绑定了,不然控制器根本“拥有”不了窗口,自然返回nil啦。
内容的提问来源于stack exchange,提问作者bgdegazio

