【问题标题】:How can I obtain window's NSControl* from custom sheet button?如何从自定义工作表按钮获取窗口的 NSControl*?
【发布时间】:2019-07-22 11:33:00
【问题描述】:

我有一个简单的“测试床”模块,由一个空的 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”方法本身(这似乎是最简单的解决方案)中访问它?

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

【问题讨论】:

  • NSAlert 只是为您提供按下按钮的结果代码。请注意,完成块是当前的事情 - 选择器已被弃用。
  • @red_menace。谢谢您的回复。我知道 NSAlert 只是提供了一个结果代码,但我想在这一点上包含 NSControl* ——前提是我可以找到某种方法来访问它并传递它,因为丢失的指针似乎是代码的唯一原因不会工作。我提到的另一种可能性是从 within 我调用的“testResize”方法访问它。我假设 NSWindow 有一个可能包含此控制指针的结构,但我无法在 NSWindow 的(假定的)结构布局中找到详细的成员列表。
  • 我仍然不确定您在寻找什么“控制”。一个 IBAction 被发送给调用它的对象,但是你在窗口中没有任何控件可以使用一个动作。如果您谈论的是窗口本身,那么您已经拥有它(通过调用工作表),因此可以直接在完成处理程序中使用它。
  • @red_menace。很高兴听到我不是唯一一个对网上找到的示例代码感到“困惑”的人,通过传递 NSControl 指针似乎过于复杂了。删除它解决了这个问题。感谢您的意见。

标签: objective-c xcode user-interface nscontrol


【解决方案1】:

问题解决了!虽然我的基础知识还不错,但一些更棘手的东西可能会让我感到厌烦。经过几天的挣扎,我意识到通过 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];
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 2012-07-07
    • 1970-01-01
    • 2012-05-04
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多