NSSegmentedControl -selectedSegment始终返回0

时间:2010-05-17 00:34:57

标签: objective-c cocoa interface-builder segment nssegmentedcontrol

我有一个NSSegmentedControl,其中两个段在Interface Builder中设置为“Select None”模式。无论我尝试什么,我都不能让-selectedSegment返回除0之外的任何内容,即使默认情况下甚至禁用了段0,也无法选择。这是当您单击控件上的任何段时调用的相关函数:

-(IBAction)changeStep:(id)sender
{
    [stepContainer setHidden:TRUE];
    [(NSView *)[[wizard stepArray] objectAtIndex:(NSInteger)[wizard step]] removeFromSuperview];
    switch ([[navigationButton cell] selectedSegment])
    {
    case 0:
        [wizard setStep:(NSInteger *)[wizard step]-1];
        break;
    case 1:
        [wizard setStep:(NSInteger *)[wizard step]+1];
        break;
    default:
        break;
    }
    //[[navigationButton cell] setSelected:FALSE forSegment:[navigationButton selectedSegment]];

    if ([wizard step] > 0)
    {
        [wizard setStep:0];
        [navigationButton setEnabled:FALSE forSegment:0];
    }

    NSLog(@"%d", [wizard step]);
    [stepContainer addSubview:(NSView *)[[wizard stepArray] objectAtIndex:(NSInteger)[wizard step]]];
    [stepContainer setHidden:FALSE withFade:TRUE];
}

我也尝试过使用-isSelectedForSegment,但结果相同 你能提供的任何帮助都很棒,我不知道我做错了什么。谢谢!
SphereCat1

编辑:这是一个facepalm时刻,请参阅下面的答案。

3 个答案:

答案 0 :(得分:1)

好吧,这是一个facepalm时刻。事实证明我是NSLogging错误的东西,并且我的步骤递增/递减逻辑中只有一个错误。

一切都好! :)

捂脸
SphereCat1

答案 1 :(得分:1)

你似乎在不需要的地方做了大量的演员。

[(NSView *)[[wizard stepArray] objectAtIndex:(NSInteger)[wizard step]] removeFromSuperview];

[wizard step]返回什么?你不应该抛弃它。

    [wizard setStep:(NSInteger *)[wizard step]-1];

这更加不一致。 NSInteger *是指针类型(NSInteger不是对象)。如果[wizard setStep:]需要NSInteger *,那么可能是因为它被用作inout参数,如果它与请求的步骤不同,可能会为您提供新步骤。在这种情况下,你需要做这样的事情:

NSInteger newStep = [wizard step] - 1;
[wizard setStep: &newStep];

答案 2 :(得分:0)

您确定navigationButton已初始化吗?像这样写一个NSLog语句:

NSLog (@"%@", navigationButton);

如果您向nil对象发送消息,则会得到0。如果navigationButtonIBOutlet,您需要确保它在Interface Builder中正确链接。