NSPopUpButton@Leopard

ようやく少し Interface Builder 3 にも慣れてきたかな、という今日この頃だが、最近 NSPopUpButton のセッティングで気になる部分があるのでメモしておきたい。


NSPopUpButton にはポップアップとプルダウンの二種類がある。NSPopUpButton を配置した直後はポップアップになっているが、必要に応じて Attributes Inspector で「pull down」を選択するとプルダウンになる。コード的には:

NSPopUpButton *hoge;
[hoge setPullsDown:YES];

今回取り上げたいのはプルダウンの方だ。NSPopUpButton には、ポップアップ/プルダウンするメニューが NSMenu としてくっついているわけだが、プルダウンのときは、通常 NSMenu の先頭の NSMenuItem がボタンのタイトルとして使用される*1。そして、プルダウンされたメニューには、タイトルとして使用されている NSMenuItem は表示されない。

ところが、Leopard にしてから何故かタイトルで使用されている NSMenuItem がメニューの内容にも重複表示されることが起きるようになった。これはカッコ悪いだけでなく、ユーザにも混乱を招く。

試行錯誤してみた所、どうやら Leopard では、その先頭の NSMenuItem に対して、-[NSMenuItem setHidden:YES] を呼んでやらないといけないようだ。即ち、

NSPopUpButton *hoge;
NSMenuItem *item = [[hoge menu] itemAtIndex:0];

[item setHidden:YES];

Interface Builder 3 で pull down な NSPopUpButton を作ると、実際そういうふうに NSMenuItem の Hidden 属性が自動的にセットされている(Attributes Inspector で確認するとわかる)。Tiger 以前で作成した nib でも、Interface Builder 3 で開いたときに自動的に Hidden にセットされるような…気もするが、されないこともあるのか?検証不足。


ところが、-[NSMenuItem setHidden:] は Leopard から追加されたメソッドなので、これをそのまま TigerPanther の人に配ったらうまく動かないんじゃないか?と思う訳である。仕方ないので、nib 上では hidden 属性を付けないでおいて、コードの方で -awakeFromNib: なりでロードしたときに、-respondsToSelector: でチェックしてから -setHidden:YES を呼ぶようにしてみている。このへんのことは特に AppKit のリリースノートでも記述が見つけられなかったが、どこかにこの話題についての Web ページなどが転がっていないか、現在探している所である。

*1:それがイヤなときは、-[NSPopUpButtonCell setUsesItemFromMenu:NO] とする