objective-c - 如何从自定义工作表按钮获取窗口的 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* 只是获取主窗口 rect 的一种间接方式(我以前从未遇到过),所以在绝望中我恢复了更常见的访问方式。将 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];
}
现在工作正常。谢谢大家。
推荐阅读
- python - 使用 Tkinter 的电子邮件切片器项目但出现错误?谁能帮助我
- javascript - Vue为什么输入中的值-在v-model中表示为空字符串?
- reactjs - 类型上不存在属性“xxxx”
- c - 为什么浮点与无穷大的比较有效?
- mysql - RMySQL dbDisconnect 没有关闭数据库连接
- sqlite - 如何在 Flutter 中按月获取数据 sqflite?
- data-structures - 二叉搜索树函数定义错误
- css - 如何使用 css 隐藏特定数据类型的值 div
- swift - 为什么用户默认发布者多次触发
- python - 如果我的项目中主文件的名称从 main.py 更改为其他名称,会有什么不同吗?