NSMenuのセパレータがうまくremoveできない

111 views
Skip to first unread message

donguri

unread,
Mar 19, 2009, 11:30:36 PM3/19/09
to cocoa-dev-japan
こんにちは、hipposです。
動的にメニューアイテムを追加するアプリ(clippy
http://hippos-lab.com/blog/node/274)を作成していますが、新たにメニュー項目を追加する時セパレータがうまく表示(remove)されないという現象に悩んでいます。例えば、

item A
item B
separetor
item Z

のようなメニューがあって、今、itemBの下にitemCを追加したとき意図しているのは単純に

item A
item B
item C
separetor
item Z

のような形式なのですが実際には

item A
item B
item C
item Z(グレー表示)
item Z

のように元々セパレータのあった位置のitemZのタイトルがグレー表示されてしまいます。(逆にitemBを削除した場合などはこういう問題は起こり
ません。)v10.5ではメニュー関連のAPIがずいぶん変更になっているみたいでこのあたりが関係していそうなんですが、何か情報をお持ちの方いらっ
しゃいましたらご教授願いたいと思います。(実際、同様のコードをv10.4で試してみたところこのような問題はでていません。)


【削除コード】

- (void)removeAllMenuItems:(NSMenu *)inMenu
{
NSArray *aItems = [inMenu itemArray];
NSMenuItem *aMenuItem;
int i;

for (i = ([aItems count] - 1); i >= 0; i--)
{
aMenuItem = [aItems objectAtIndex:i];
if ((![aMenuItem isSeparatorItem]) && ([aMenuItem hasSubmenu]))
{
[self removeAllMenuItems:[aMenuItem submenu]];
}
[inMenu removeItem:aMenuItem];
}
}

【追加コード】
[[NSApp mainMenu] addItem:[NSMenuItem separatorItem]];
NSMenuItem *menuItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]]
initWithTitle:NSLocalizedString(@"some_menu1",
"SomeMenu1") action:nil keyEquivalent:@""];
[menuItem setTag:tags];
[menuItem setTarget:self];
[menuItem setEnabled:NO];
[[NSApp mainMenu] addItem:menuItem];
[menuItem release];

[[NSApp mainMenu] addItem:[NSMenuItem separatorItem]];
menuItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]]
initWithTitle:NSLocalizedString(@"some_menu2",
"SomeMenu2") action:nil keyEquivalent:@""];
[menuItem setTag:tags];
[menuItem setTarget:self];
[[NSApp mainMenu] addItem:menuItem];
[menuItem release];
:
:

wang

unread,
Mar 21, 2009, 4:13:24 AM3/21/09
to cocoa-dev-japan
やってみましたが、問題なく表示されます。10.5.6。

他の部分の影響ではないでしょうか?単純なメニュー追加/削除だけのアプリで試してみてはどうでしょうか?

On 3月20日, 午後12:30, donguri <hippo...@gmail.com> wrote:
> こんにちは、hipposです。
> 動的にメニューアイテムを追加するアプリ(clippyhttp://hippos-lab.com/blog/node/274)を作成していますが、新たにメニュー項目を追加する時セパレータがうまく表示(remove)されないという現象に悩んでいます。例えば、

donguri

unread,
Mar 22, 2009, 2:59:55 PM3/22/09
to cocoa-dev-japan
hipposです。

wangさん、ご検証ありがとうございます。

ご指摘のとおり、サンプルを作成して試してみたところ気づいたことがあってそこを修正したところうまくいきました。

作成していたのはいわゆる「メニューバーアプリ」(正式にはなんというのでしょうか?)で通常のアプリケーションメニューとは違い、
「ファイル」ー「編集」ー「表示」....が横に並ぶのではなく縦にならぶタイプのメニューになります。NIB上のメニューは空で開始します。
で、ここにメニューを追加するのに[NSApp mainMenu] addItem:someItem]としていましたがどうもこれがいけなかったよ
うです。

実際には、[NSApp mainMenu] addItem:xxxx]でもうまく表示できていたので惑わされたんですが、これだと例えば「ファイ
ル」ー「編集」の間にセパレータを突っ込んだような状態になるわけです。
通常のアプリケーションのメニュー追加の場合のように、まずNSMenuをひとつ追加しこれに対してaddItemをすることで正しく動作しました。


> 他の部分の影響ではないでしょうか?単純なメニュー追加/削除だけのアプリで試してみてはどうでしょうか?

結局、初手から間違っていたわけです。他の部分を疑うことなく視野狭窄に陥って追加・削除のコードだけを追っていたので気づきませんでした。ご指摘のと
おり、すぐに確認のサンプルを作成すべきでしたね。ありがとうございます。
Reply all
Reply to author
Forward
0 new messages