57942


MacOSでSwiftを用いた画面作成について教えて下さい。

storyboardでViewController上に2つのComboboxを置いて、それぞれのクリック時の動作を制御したいのですが、前にクリックしたコンボボックスのActionメソッドにも飛んでしまいます。

## ViewController.swift

[code]

    import Cocoa
    
    class ViewController: NSViewController {
    
        @IBOutlet weak var cmb1: NSComboBox!
        @IBOutlet weak var cmb2: NSComboBox!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            // Do any additional setup after loading the view.
        }
    
        override var representedObject: Any? {
            didSet {
            // Update the view, if already loaded.
            }
        }
    
    
        @IBAction func selCmb1(_ sender: NSComboBox) {
            print("pushCmb1")
        }
    
    
        @IBAction func selCmb2(_ sender: NSComboBox) {
            print("pushCmb2")
        }
    
    }
    
[/code]

コンボボックス１クリック、コンボボックス２をクリックした時に表示されたprint文が  
下記になります。

①コンボボックス１選択し、プルダウンでアイテム表示  
②アイテム選択  
pushCmb1  
③コンボボックス２選択、プルダウンでアイテム表示  
pushCmb1  
④アイテム選択  
pushCmb2

となり、③のコンボボックス２を選択した際に、コンボボックス１のActionメソッドが動いてしまいます。  
そもそもプルダウンでアイテム表示した際のActionメソッドが不要で、アイテム選択時のみActionメソッドに飛んで欲しいのですが、どうすればよいでしょうか？


CC BY-SA 4.0
2019-09-05T05:33:48.647
57864
2019-09-09T03:11:52.920
2019-09-05T06:44:19.337
9008
35619
question
swift macos
MacOS Swifで作るComboboxのActionメソッドについて


`NSCombobox`に対しては、Actionメソッドでなく、`NSComboBoxDelegate`（<https://developer.apple.com/documentation/appkit/nscomboboxdelegate>）を使ってください。その中にある、`comboBoxSelectionDidChange(_:)`を使えば、「アイテム選択時のみ」「飛んで欲しい」メソッドとすることができます。

> ③のコンボボックス２を選択した際に、コンボボックス１のActionメソッドが動いてしまいます。

その判断は、じつは正しくありません。いくつかの検証をしてみればわかりますが、コンボボックスが、キーボードの入力対象から外れたタイミングで、Actionメソッドが送られることが確認できます。キーボードの入力対象が、コンボボックスから例えば`NSTextField`に移った時にも、そうなります。「コンボボックス２を選択した際」、「コンボボックス２」が、「コンボボックス１のActionメソッド」を送っているわけではありません。


CC BY-SA 4.0
2019-09-09T03:11:52.920
57942
2019-09-09T03:11:52.920
18540
57864
answer