AppKit ラジオボタンを実装する

超簡単っぽいけど、知らないと少し躓くAppKitネタ。

# ラジオボタンとは
こういうボタン。

![radio_button_examples_2x-1.png](https://qiita-image-store.s3.amazonaws.com/0/61792/3a909059-0d28-0d9d-3897-18ad4fa859fc.png)


*GUIウィジェットの一種で、事前定義された選択肢のうち1つを選択する場合に使う。カーラジオの選局ボタンでは1つのボタンを押すと、他の押されていたボタンが押されていない状態に戻り、常に1つのボタンだけが押された状態になる。これがラジオボタンの名称の由来である。*

（[ラジオボタン](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%B8%E3%82%AA%E3%83%9C%E3%82%BF%E3%83%B3) - wikipediaより）

加えて[OSX Human Interface Guideline](https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/ControlsButtons.html#//apple_ref/doc/uid/20000957-CH48-SW1)には、以下の事が記載されています

* ウィンドウ内のみに用いられる（toolbarとかには使われない）
* ボタンのテキストはコンテキストに応じて変更されない
* カスタムテキスト、画像を表示しない

# 実装
NSButtonのradio buttonをただ配置するだけでは、択一の選択ができません。
ですので、NSMatrixを使います。

今回はラジオボタン押したら、押されたラジオボタンのタイトルを出力するサンプルを作ります。
## InterfaceBuilderを使う方法(普通こっち)

InterfaceBuilderのObject libraryにNSMatrixがないのでちょっとわかりにくいです。
### InterfaceBuilderの設定

とりあえず、ラジオボタンを配置
<img width="861" alt="スクリーンショット 2016-02-04 17.27.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/a61ab169-b8ec-e968-426a-45fb9cf668a4.png">

ボタンを選択した状態で、メニュー → Editor → Embed In → Matrixを選択
<img width="554" alt="スクリーンショット 2016-02-04 17.27.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/cbadba20-2b09-806e-1aab-003234557011.png">

InspectorからRows, Columnsを設定して、ラジオボタンの要素数を増やす
<img width="838" alt="スクリーンショット 2016-02-04 17.28.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/61792/bf97f284-2e6b-fdee-2e3a-ed93b4ce6a72.png">


### ソースコード
ラジオボタン（Matrix）が押下された時のアクションメソッドを実装

```swift
@IBAction func radioButtonPushed(sender: AnyObject) {
        guard let matrix = sender as? NSMatrix else {
            return
        }
        
        guard let cell = matrix.selectedCell() else {
            return
        }
        
        print(cell.title)
    }
```

これで動くと思います。

## コードのみで書く方法
### ソースコード
```swift:ViewController.swift

import Cocoa

class ViewController: NSViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let buttonCell = NSButtonCell()         // radio buttonのセル
        buttonCell.setButtonType(.RadioButton)
        
        // Matrixに表示範囲, Mode, buttonCell, 縦/横の個数を設定
        let matrix = NSMatrix(frame: CGRectMake(10, 10, 300, 20), mode: .RadioModeMatrix, prototype: buttonCell, numberOfRows: 1, numberOfColumns: 2)
        
        // 1つ1つのセルサイズを設定
        matrix.cellSize = CGSizeMake(150, 20)
        
        // Actionの設定
        matrix.action = "radioButtonPushed:"
        
        // Label
        matrix.cells[0].title = "buttonA"
        matrix.cells[1].title = "buttonB"
        
        // 初期設定
        matrix.selectCellAtRow(0, column: 0)
        
        self.view.addSubview(matrix)
    }

    // ボタン押下時にセルのLabelを出力する
    @IBAction func radioButtonPushed(sender: AnyObject) {
        guard let matrix = sender as? NSMatrix else {
            return
        }
        
        guard let cell = matrix.selectedCell() else {
            return
        }
        
        print(cell.title)
    }
    
}

```


# ラジオボタン使用時のTips
* 複数選択できる選択肢のセットを表示するにはラジオボタンではなく、チェックボックスを使いましょう。
* 5つ以上の項目を表示するときは、ポップアップメニューが適切です。
* ラジオボタンを使ってボタン押下時のアクションを開始することは控えましょう。
	* 代わりにプッシュボタン（普通のボタン）を使いましょう。
* 各ラジオボタンには選択肢を説明するラベルをつけましょう。
* ラジオボタンを水平に並べるときの横スペースには一貫性を持たせましょう。

# 参考
[OSX Human Interface Guideline](https://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/OSXHIGuidelines/ControlsButtons.html#//apple_ref/doc/uid/20000957-CH48-SW1)