如何从自定义工作表按钮获取窗口的 NSControl*?



我有一个简单的"测试台"模块,由一个空的NSWindow组成。窗口上的唯一项目是一个标有"切换窗口"的按钮,没有其他内容。它有如下所示的一种方法:

-(IBAction)testResize:(NSControl*)sender;
{
NSRect frame = sender.window.frame;
if(frame.size.width == 225)
frame.size.width += 160;
else
frame.size.width -= 160;
[sender.window.setFrame:frame display:YES animate:YES];
}

单击此按钮可在 225 到 385 像素之间切换窗口的宽度,并且效果很好。计划是向我的主应用程序添加类似的方法,但这次是从自定义工作表上的按钮调用的,如下所示:

-(void)customSheetDidEnd:(NSAlert*)alert returnCode:(NSInteger returnCode contextInfo:(void*)contextInfo
{
switch (returnCode)
{    
case 1000:
{
[self testResize:(NSControl*)theWindow];
// print it ...
break;
}
case 1001:
{
// save it...
break;
}
case 1002:
{
// forget it...
break;
}
}
}

此尝试不执行任何操作,即使在将被调用方法的名称更改为上面显示的名称后也是如此。在这种情况下,我无法连接 IBAction,因为自定义工作表按钮当然不会显示在 .xib 文件中。是否可以 (a) 通过修改调用将此 NSControl 指针传递给我的方法,或者 (b) 从"testResize"方法本身访问它(这似乎是最简单的解决方案)?

我已经尝试了上述内容并在网上搜索了几天,但似乎找不到任何似乎可以回答我具体问题的东西。谢谢。

问题解决了!虽然我对基础知识相当满意,但一些更棘手的东西可能会让我失望。经过几天的挣扎,我意识到通过NSControl*只是进入主窗口矩形的间接方式(我以前从未遇到过),所以在绝望中,我恢复了更常见的访问方式。简化了 customSheetDidEnd 中的方法调用,使其读取:

-(void)customSheetDidEnd:(NSAlert*)alert returnCode:(NSInteger returnCode contextInfo:(void*)contextInfo
{
switch (returnCode)
{    
case 1000:
{
[self testResize];  //### changed ###
// print it ...
break;
}
case 1001:
{
// save it...
break;
}
case 1002:
{
// forget it...
break;
}
}
}

和接收方法:

-(void)testResize  //### changed ###
{
NSRect frame = [theWindow frame];
if(frame.size.width == 225)
frame.size.width += 160;
else
frame.size.width -= 160;
[theWindow setFrame]:frame display:YES animate:YES];
}

现在工作正常。谢谢大家。

最新更新