コンボボックスの基本

コンボボックスの基本

macOS 10.15.7 / Xcode 11.3.1 / Swift 5.0
[image1]
コンボボックスの一般的な実装方法についてポイントとなる事柄を紹介する。

項目の設定方法

1. 直接入力方式

項目の配列を指定する
項目をひとつづつ指定する

2. データソース方式

テーブルビュー(NSTableViewクラス)のデータ設定方法と同じ方式。NSComboBoxDataSourceプロトコルを実装し、データとコンボボックスを連動させる。
Grok2
NSComboBoxは内部でテキストとして表示するため、Any型のオブジェクトも受け付けますが、そのオブジェクトのdescriptionやstringValueを表示します。つまり、文字列に変換可能なものであれば表示できますが、純粋なテキスト以外の形式で表示することはできません。

特定の項目を選択状態にする

選択された項目を取得する

NSComboBoxDelegateメソッドを実装する。comboBoxSelectionDidChangeはコンボボックスの選択項目が変わったときに起動するメソッドである。
このイベントは、ユーザがコンボボックスを操作して項目を選んだとき、また、コードから selectItemメソッドなどで項目を選択状態にしたときに発生する。ただし、値が変化しなかった場合、つまり現状の項目と、これから選ぼうとしている項目が同じ場合には発生しない。
ボタンのアクションに応じて選択項目を取得する
前記の方法より操作がひとつ増えるが、後続の処理の実行可否をユーザが決められる、同じ項目選んでも実行できるという特徴がある。アプリケーションの仕様次第でどちらかを選べばよいだろう。

テキストフィールドに値を入力する

コンボボックスのテキストフィールドは、プロパティを編集可能(editable)にすれば、任意のテキストを入力することができる。NSComboBoxクラスは NSTextFieldクラスから継承しているので、 テキストフィールドで行えることは、コンボボックスでも行うことができる。
入力フィールドの値はコンボボックスオブジェクトの stringValueプロパティから読み取ることができる。このプロパティには、選択肢から選択された項目と、ユーザが入力した値のいずれも入る。
任意に入力したフィールドの値が、コンボボックスに定義した項目の一つともし同じであれば、indexOfSelectedItemプロパティ、objectValueOfSelectedItemプロパティには、項目に応じた値が正しく設定される。異なっていれば、前者には -1、後者には nilが入るので、エラーが発生しないよう相応の対応が必要になる。

コンボボックスの外観にかかわること

コンボボックスに一度に表示する項目の数は、numberOfVisibleItemsプロパティで指定する。
fontプロパティを設定すれば文字のフォントやサイズを変更することができる。項目の1行の高さは、文字のサイズに応じて自動的に調整されるが、テキストフィールドの高さを変えるのは、サブクラスをいくつか作成したりと、かなり面倒な作業になる。保守性などを考えたら本当に必要がない限り行わない方がいいだろう。