如何为NSPopUpButton进行项目更改?

时间:2013-09-12 08:46:57

标签: objective-c macos nspopupbutton

我正在尝试实施一个根据NSPopUpButton状态更改标签的系统 到目前为止,我已尝试执行下面代码中显示的内容,但每当我运行它时,代码只会跳转到else子句,抛出警报

- (IBAction)itemChanged:(id)sender {
    if([typePopUp.stringValue isEqualToString: @"Price per character"]) {
        _currency = [currencyField stringValue];
        [additionalLabel setStringValue: _currency];

    }
    else if([typePopUp.stringValue isEqualToString: @"Percent saved"]) {
        _currency = additionalLabel.stringValue = @"%";
    }

    else alert(@"Error", @"Please select a calculation type!");
}

所以这里的任何人都知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:5)

@hamstergene是在正确的轨道上,但是正在比较菜单项的标题,而不是比较标签,这是错误的,原因如下:

  1. 这意味着您无法将应用程序国际化。
  2. 它介绍了拼写错误的可能性。
  3. 这是一种效率低下的比较;比较字符串中的每个字符比比较单个整数值要长。
  4. 说了这么多,NSPopUpButton使得很难在菜单项中插入标签,因此您需要使用所选项目的索引:

    假设您使用以下方式创建菜单项:

    [typePopUp removeAllItems];
    [typePopUp addItemsWithTitles: [NSArray arrayWithObjects: @"Choose one...", @"Price per character", @"Percent saved", nil]];
    

    然后创建一个匹配数组中标题顺序的enum

    typedef enum {
        ItemChooseOne,
        ItemPricePerCharacter,
        ItemPercentSaved
    } ItemIndexes;
    

    然后比较所选的项目索引,如下所示:

    - (IBAction)itemChanged:(id)sender {
        NSInteger index = [(NSPopUpButton *)sender indexOfSelectedItem];
        switch (index) {
        case ItemChooseOne:
            // something here
            break;
        case ItemPricePerCharacter:
            _currency = [currencyField stringValue];
            [additionalLabel setStringValue: _currency];
            break;
        case ItemPercentSaved:
            _currency = @"%";               // See NOTE, below
            additionalLabel.stringValue = @"%";
            break;
        default:
            alert(@"Error", @"Please select a calculation type!");
        }
    }
    

    注意您的代码中的以下行不正确:

    _currency = additionalLabel.stringValue = @"%";
    

    多项作业有效,因为x = y结果y。涉及二传手时不是这种情况。更正的代码在上面。

    编辑这个答案经过大量编辑,后面是OP的更多信息。

答案 1 :(得分:2)

NSPopUpButton中查询当前所选项目的标题:

NSMenuItem* selectedItem = [typePopUp selectedItem];
NSString* selectedItemTitle = [selectedItem title];

if ([selectedItemTitle isEqualTo: ... ]) { ... }

请注意,比较UI字符串是一个非常糟糕的主意。 UI中的最轻微变化将立即破坏您的代码,并且您正在阻止将来的本地化。您应该使用-[NSMenuItem setTag:]或-[NSMenuItem setRepresentedObject:]为每个项目分配数字或对象值,并使用它们来识别项目。