デリゲート メソッドを実装しましたcomboBoxWillPopUp
が、NSComboBox のポップアップを開いたときに呼び出されません。
同じクラスに実装されているなどの他のデリゲート メソッドはcomboBoxSelectionDidChange
期待どおりに呼び出されるため、comboBox は適切に設定されているようです。
プロジェクトの派生データを削除して、新しく実装されたメソッドがコンパイルされるようにしましたが、違いはありませんでした。メソッドの最初の行にブレークポイントを設定すると、ヒットすることはありません。
私は過去に明らかなことを見逃していましたが、今はそうではないかと疑っています。それが何であるか分かりますか?
uchuugaka の要求に従って、いくつかのコード:
コンボボックスはアウトレットです:
@property (nonatomic, retain) IBOutlet NSComboBox *cmbSubject;
そのコントローラーは、NSComboBoxDelegate プロトコルを (特に) 正式に実装します。
@interface EditorController : NSWindowController <NSComboBoxDelegate, NSComboBoxDataSource, NSTextViewDelegate, NSTextStorageDelegate, NSTabViewDelegate, NSDrawerDelegate, NSTableViewDelegate, NSTableViewDataSource, NSWindowDelegate >
コンボ ボックス デリゲートは、コントローラーの awakeFromNib で割り当てられます。
- (void) awakeFromNib {
// other stuff...
[self.cmbSubject setUsesDataSource:YES];
[self.cmbSubject setDataSource:self];
[self.cmbSubject setDelegate:self]; // controller (self) assigned as delegate
[self.cmbSubject setCompletes:YES];
// Tell the combobox to reload; otherwise it looks OK but thinks it's empty.
// (Data source caches are in DataSourceCoordinator, which should be set up before this controller.)
[self.cmbSubject reloadData];
// other stuff...
}
コントローラーは、comboBoxWillPopUp を実装します。
- (void) comboBoxWillPopUp:(NSNotification *)notification {
// If breakpoint is added here, it is never hit.
NSComboBox *cmb = [notification object];
// Determine the maximum height available to the cmb popup...
CGFloat heightAvailable;
CGFloat heightScreen = [NSScreen mainScreen].frame.size.height;
CGFloat heightOriginCMB = cmb.frame.origin.y + self.window.frame.origin.y; // origin is from bottom
// ...which usually will be the space below the cmb...
if (heightOriginCMB >= heightScreen/2)
heightAvailable = heightOriginCMB;
// ...unless user has positioned the window very low, in which case the cmb will present the popup on top if necessary.
else
heightAvailable = heightScreen - heightOriginCMB;
// Determine the maximum number of items that can be displayed.
NSInteger iMaxItemsToDisplay = heightAvailable / [cmb itemHeight]; // truncate to whole number
// Ensure the max is at least 3, just in case.
// (If window contents are rearranged so that cmb origin is no longer relative to Editor window, or if item height is set to some large number, this could be an issue.)
if (iMaxItemsToDisplay < 3)
iMaxItemsToDisplay = 3;
// Set cmb's numberOfVisibleItems, which acts as a maximum.
[cmb setNumberOfVisibleItems:iMaxItemsToDisplay];
}