Swift でラジオボタンを作る方法

Swift で iOS のアプリを作る時に使う UIKit の中にはラジオボタンがありません。

ここでは、Swift でラジオボタンを作る方法をご説明します。

Swift でラジオボタンを作る方法 1

テスト用の iOS アプリの作る

まずはテスト用にラジオボタンを追加して値を取得する iOS アプリを作ります。

Xcode で [iOS] の [App] の新規プロジェクトを作成します。

新規アプリの作り方、ボタンの追加の方法、アクションの作り方などがわからない方は「基本的な iOS アプリの作り方」をご覧ください。


以下のようなラジオボタンがチェックされていない状態の画像と、チェックされている状態の画像を準備します。

Swift でラジオボタンを作る方法 radio_unchecked

Swift でラジオボタンを作る方法 radio_checked


二つの画像を、Assets.xcassets にドラッグ&ドロップして追加しておきます。

Swift でラジオボタンを作る方法 2


Main ストーリーボードの View Controller に、ボタン (UIButton) をひとつ追加します。

Swift でラジオボタンを作る方法 3


ボタンの Title を Radio Button 1 に、Image に radio_unchecked の画像を設定し、テキストの色をダークグレーにしてフォントも変更しました。

位置、色やフォントなどはお好みで設定してください。

Swift でラジオボタンを作る方法 4


このボタンをコピペして、Title を変更して、Radio Button 2 と Radio Button 3 を作ります。

Swift でラジオボタンを作る方法 5


選択されているラジオボタンを表示するために SAVE ボタンを追加しておきます。

Swift でラジオボタンを作る方法 6


ボタンから、それぞれ radioButton1、radioButton2、radioButton3 という名前でアウトレットを作っておきます。

Swift でラジオボタンを作る方法 7

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var radioButton1: UIButton!
    @IBOutlet weak var radioButton2: UIButton!
    @IBOutlet weak var radioButton3: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

Radio Button 1 ボタンから、radioButtonTapped、Save ボタンから saveTapped という名前で Touch Up Inside のアクションを作ります。

Swift でラジオボタンを作る方法 8

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var radioButton1: UIButton!
    @IBOutlet weak var radioButton2: UIButton!
    @IBOutlet weak var radioButton3: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func radioButtonTapped(_ sender: Any) {
    }
    
    @IBAction func saveTapped(_ sender: Any) {
    }
}

View Contorller を以下の緑枠のアイコンを右クリックし、 radioButtonTapped から radioButton2 ボタンにドラッグして、TouchUpInside を選択します。

同様にして、radioButtonTapped から radioButton3 ボタンにドラッグして、Touch Up Inside を選択しておきます。

Swift でラジオボタンを作る方法 9

Swift でラジオボタンを作る方法 10


これで、radioButton1、radioButton2、radioButton3 の Touch Up Inside イベントで radioButtonTapped が実行されるようになりました。

Swift でラジオボタンを作る方法 11


Swift でラジオボタンを作る方法

それでは、Swift でラジオボタンを作るコードを書いていきましょう。

やり方はいろいろあるかと思いますが、ここでは UIButton クラスを元に RadioButton クラスをつくります。


メニューの File > New > File... から RadioButton.swift という名前の Swift File を追加します。

Swift でラジオボタンを作る方法 12


RadioButton.swift に以下のコードを追加します。

import UIKit

@IBDesignable
final class RadioButton: UIButton {

    let checkedImage = UIImage(named: "radio_checked")! as UIImage
    let uncheckedImage = UIImage(named: "radio_unchecked")! as UIImage

    var isChecked: Bool = false {
        didSet{
            if isChecked {
                self.setImage(checkedImage, for: .normal)
            } else {
                self.setImage(uncheckedImage, for: .normal)
            }
        }
    }
}

Swift でラジオボタンを作る方法 18


アセットに追加した radio_checked と radio_unchecked から、UIImage を定義しています。

isChecked というプロパティを追加し、isChecked がセットされた時に true であれば、image を checkedImage に、false の時は uncheckedImage に設定するようにしています。


Main.storyboard で Radio Button ボタンを選択し、Class に RadioButton を設定し、アウトレットのクラスも RadioButton に変更しておきます。

Swift でラジオボタンを作る方法 13

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var radioButton1: RadioButton!
    @IBOutlet weak var radioButton2: RadioButton!
    @IBOutlet weak var radioButton3: RadioButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @IBAction func radioButtonTapped(_ sender: Any) {
    }
    
    @IBAction func saveTapped(_ sender: Any) {
    }
}

次に、メニューの File > New > File... から RadioButtonGroup.swift という名前の Swift File を追加します。

RadioButtonGroup.swift に以下のコードを追加します。

import UIKit

final class RadioButtonGroup: NSObject {
    var radioButtons: [RadioButton]!
    var selected: RadioButton?

    func changed(selected: RadioButton) {
        for rb in radioButtons {
            if rb == selected {
                self.selected = rb
                rb.isChecked = true
            } else {
                rb.isChecked = false
            }
        }
    }
}

Swift でラジオボタンを作る方法 19


RadioButtonGroup クラスでは、グルーピングしたい RadioButton を radioButtons に配列として保持しています。

changed() で selected にセットされたラジオボタンの isChecked を true に、それ以外のラジオボタンの isChecked を false にしています。


ViewController で RadioButtonGroup を生成して、viewDidLoad() で初期設定をします。

最初は radioButton1 を選択状態にしています。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var radioButton1: RadioButton!
    @IBOutlet weak var radioButton2: RadioButton!
    @IBOutlet weak var radioButton3: RadioButton!
    
    var radioButtonGroup: RadioButtonGroup = RadioButtonGroup()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        radioButtonGroup.radioButtons = [radioButton1, radioButton2, radioButton3]
        radioButtonGroup.changed(selected: radioButton1)
    }
    
    @IBAction func radioButtonTapped(_ sender: Any) {
    }
    
    @IBAction func saveTapped(_ sender: Any) {
    }
}

次に、radioButtonTapped() を次のように変更します。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var radioButton1: RadioButton!
    @IBOutlet weak var radioButton2: RadioButton!
    @IBOutlet weak var radioButton3: RadioButton!
    
    var radioButtonGroup: RadioButtonGroup = RadioButtonGroup()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        radioButtonGroup.radioButtons = [radioButton1, radioButton2, radioButton3]
        radioButtonGroup.changed(selected: radioButton1)
    }
    
    @IBAction func radioButtonTapped(_ sender: Any) {
        guard let radioButton = sender as? RadioButton else { return }
        radioButtonGroup.changed(selected: radioButton)
    }
    
    @IBAction func saveTapped(_ sender: Any) {
    }
}

radioButton1、radioButton2、radioButton3 のどれかがタップされた時に、sender を RadioButton にキャストして、radioButtonGroup.changed() メソッドを実行しています。


最後に、Save ボタンがタップされた時に、選択されているラジオボタンがどれかを print するために saveTapped() を以下のように変更します。

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var radioButton1: RadioButton!
    @IBOutlet weak var radioButton2: RadioButton!
    @IBOutlet weak var radioButton3: RadioButton!
    
    var radioButtonGroup: RadioButtonGroup = RadioButtonGroup()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        radioButtonGroup.radioButtons = [radioButton1, radioButton2, radioButton3]
        radioButtonGroup.changed(selected: radioButton1)
    }
    
    @IBAction func radioButtonTapped(_ sender: Any) {
        guard let radioButton = sender as? RadioButton else { return }
        radioButtonGroup.changed(selected: radioButton)
    }
    
    @IBAction func saveTapped(_ sender: Any) {
        switch radioButtonGroup.selected {
        case radioButton1:
            print("Radio Button 1 が選択されています。")
        case radioButton2:
            print("Radio Button 2 が選択されています。")
        case radioButton3:
            print("Radio Button 3 が選択されています。")
        default:
            print("選択されていません。")
        }
    }
}

Swift でラジオボタンを作る方法 14

以上が、Swift でラジオボタンを作るコードです。


iOS アプリをシミュレーターでテストする

それでは、作った iOS アプリをビルド・実行して確認してみます。

Swift でラジオボタンを作る方法 15


シミュレーターが起動し、画面が表示されます。

Swift でラジオボタンを作る方法 16


Radio Button 2 を選択して、SAVE ボタンをタップします。

Swift でラジオボタンを作る方法 17

アウトプット画面に「Radio Button 2 が選択されています。」と表示されました。


以上、Swift でラジオボタンを作る方法をご説明しました。

© 2024 iOS 開発入門