2014-01-27 76 views
0

我有一個基於文檔的應用程序,並在文檔視圖中,我有一個NSSearchField。在搜索字段中,我啓用了菜單,我將顯示該菜單,並將菜單項與相關操作關聯起來。其中一個菜單項稱爲「匹配大小寫」。我希望能夠在此菜單項下放置(並移除)檢查。當我嘗試這樣做時,菜單不顯示檢查。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的日誌信息,但從來就沒有旁邊的菜單項的檢查。當我在調試時查看菜單項對象時,在切換之前,我看到「狀態」值設置爲0和1。

任何關於我失蹤的建議?

+0

是的,你應該使用'validateMenuItem'方法。這是因爲彈出菜單時,實際使用的菜單不是您的IBOutlet直接控制的菜單,而是其副本。 –

回答

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; 
}