我有一个基于文档的应用程序,在文档视图中,我有一个NSSearchField。在搜索字段中,我启用了菜单,我将其显示出来,并且我已将相关操作与菜单项相关联。其中一个菜单项称为“匹配大小写”。我希望能够在此菜单项旁边放置(并删除)支票。当我尝试这样做时,菜单不会显示支票。
-(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.但菜单项旁边从不检查。当我在调试时查看菜单项对象时,我确实在切换之前看到“state”值设置为0和1。
有关我缺少的任何建议吗?
答案 0 :(得分: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;
}