3

我正在尝试实现一个基于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!");
}

那么这里有人知道如何解决这个问题吗?

4

2 回答 2

5

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

  1. 这意味着您无法将应用程序国际化。
  2. 它引入了拼写错误的可能性。
  3. 这是一种低效的比较;比较字符串中的每个字符比比较单个整数值花费的时间更长。

说了这么多,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 = @"%";

多重赋值有效,因为is的结果。当涉及到 setter 时,情况并非如此。更正的代码在上面。x = yy

编辑根据 OP 的更多信息,对这个答案进行了大量编辑。

于 2013-09-12T09:09:07.257 回答
2

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

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

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

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

于 2013-09-12T09:00:02.220 回答