如何从自定义 sheet 按钮获取 window 的 NSControl*?
How can I obtain window's NSControl* from custom sheet button?
我有一个简单的 'test bed' 模块,其中包含一个空的 NSWindow。 window 上唯一的项目是一个标有 'Toggle Window' 的按钮,除此之外别无他物。它具有如下所示的一种方法:
-(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 像素之间切换 window 的宽度并且效果很好。计划是向我的主应用程序添加一个类似的方法,但这次是从自定义 sheet 上的按钮调用的,如下所示:
-(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,因为自定义 sheet 按钮当然不会显示在 .xib 文件中。是否可以 (a) 通过修改调用将此 NSControl 指针传递给我的方法,或者 (b) 从 'testResize' 方法本身内部访问它(这似乎是最简单的解决方案)?
我已经对上述内容进行了试验并在网上搜索了好几天,但似乎找不到任何似乎可以回答我的具体问题的内容。谢谢
问题已解决! 虽然我的基础知识还算不错,但一些棘手的问题可能会让我感到困惑。经过几天的努力,我意识到传递 NSControl* 只是一种 indirect 到达主要 window 矩形的方法(我以前从未遇到过)所以在无奈之下,我又回到了更常见的访问方式。将 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];
}
现在工作正常。感谢大家。
我有一个简单的 'test bed' 模块,其中包含一个空的 NSWindow。 window 上唯一的项目是一个标有 'Toggle Window' 的按钮,除此之外别无他物。它具有如下所示的一种方法:
-(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 像素之间切换 window 的宽度并且效果很好。计划是向我的主应用程序添加一个类似的方法,但这次是从自定义 sheet 上的按钮调用的,如下所示:
-(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,因为自定义 sheet 按钮当然不会显示在 .xib 文件中。是否可以 (a) 通过修改调用将此 NSControl 指针传递给我的方法,或者 (b) 从 'testResize' 方法本身内部访问它(这似乎是最简单的解决方案)?
我已经对上述内容进行了试验并在网上搜索了好几天,但似乎找不到任何似乎可以回答我的具体问题的内容。谢谢
问题已解决! 虽然我的基础知识还算不错,但一些棘手的问题可能会让我感到困惑。经过几天的努力,我意识到传递 NSControl* 只是一种 indirect 到达主要 window 矩形的方法(我以前从未遇到过)所以在无奈之下,我又回到了更常见的访问方式。将 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];
}
现在工作正常。感谢大家。