デモ
手順
1. カスタムクラスを作成
まずUISegmentedControlのカスタムクラスを作成します。
⌘+Nで新規ファイル作成画面にいきます。
Cocoa Touch Classを選択し、Nextをクリック。
次にクラス名を適当に付けて、SubclassにUISegmentedControlを選んでNext。
次の画面でファイルの保存場所を指定して作成します。
そして作成したカスタムクラスを以下の様に記述します。
CustomSegmentedControl.swift
import UIKit
class CustomSegmentedControl: UISegmentedControl {
var oldValue : Int!
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
self.oldValue = self.selectedSegmentIndex
super.touchesBegan(touches, with: event )
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
super.touchesEnded(touches, with: event )
if self.oldValue == self.selectedSegmentIndex
{
sendActions(for: .valueChanged )
}
}
}
2. カスタムクラスを適応
設置したUISegmentedControlに先程作成したカスタムクラスを適応させます。
3. 紐付け
UISegmentedControlをViewControllerに紐付けします。
設置したUISegmentedControlを扱うためにOutletで接続。
4. タップした時の処理を記述
値を入れる変数を用意して、タップ時の処理を記述して完成です。
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var sexSC: CustomSegmentedControl!
var sex: String = ""
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func sexSCDidTapped(_ sender: CustomSegmentedControl) {
let selectedIndex = sexSC.selectedSegmentIndex
if sex == sexSC.titleForSegment(at: selectedIndex)! {
sexSC.selectedSegmentIndex = UISegmentedControlNoSegment // 選択解除
sex = ""
} else {
sex = sexSC.titleForSegment(at: selectedIndex)!
}
print(sex)
}
}
参考:detect event when tapped on already selected segment - Stack Overflow