0

我有一个基于文档的应用程序,并且在文档视图中,我有一个 NSSearchField。在搜索字段中,我启用了要显示的菜单,并且我已将操作与菜单项相关联。其中一个菜单项称为“Match Case”。我希望能够在这个菜单项旁边放置(和删除)一个检查。当我尝试这样做时,菜单不显示检查。

-(IBAction)searchMenuMatchCase:(id)sender {
    NSMenuItem *smi = [searchMenu itemWithTitle:@"Match Case"];
    if (searchCaseSensitive) {
        searchCaseSensitive = false;
        [[searchMenu itemWithTitle:@"Match Case"] setState:NSOffState];
    } else {
        searchCaseSensitive = true;
        [[searchMenu itemWithTitle:@"Match Case"] setState:NSOnState];
    }
    [searchMenu update];
    NSLog(@"SM State %ld",[smi state]);
}

代码被执行,我收到一条日志消息,显示状态从 0 到 1 再到 0 到 1。但是菜单项旁边从来没有检查。当我在调试时查看菜单项对象时,我确实看到在切换它之前将“状态”值设置为 0 和 1。

关于我缺少什么的任何建议?

4

1 回答 1

0

为了解决这个问题,我不得不使用 NSMenuDelegate 并使用方法validateMenuItem。这样,在绘制菜单之前调用了 validateMenuItem 方法,并且我可以确保在绘制菜单之前正确设置了状态。我相信发生的事情是我在原始代码中得到的菜单项不是正在绘制的实际菜单,而只是一个模板。

/**
 This is called when the user selectes the "Match Case" menu item found in the Search field
 */
-(IBAction)searchMenuMatchCase:(id)sender {
    if (searchCaseSensitive) {
        searchCaseSensitive = false;
    } else {
        searchCaseSensitive = true;
    }
}

/**
 This is called Each time a menu is shown.
 */
-(BOOL) validateMenuItem:(NSMenuItem *)menuItem {

    if ([[menuItem title] compare:@"Match Case"] == 0) {
        if (searchCaseSensitive) {
            [menuItem setState:NSOnState];
        } else {
            [menuItem setState:NSOffState];
        }
    }
    return YES;
}
于 2014-02-06T19:07:02.627 回答