0

私はドキュメント ベースのアプリケーションを持っています。ドキュメント ビューには 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 に設定されていることがわかります。

私が欠けているものに関する提案はありますか?

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 に答える