Edited at

【Swift】UISegmentedControlで同じセグメントを2回タップしたら選択解除する方法

More than 1 year has passed since last update.


デモ


手順


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で接続。

タップイベントを取得するためにActionでも接続。


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