我有我使用的代碼從該柱子類5段segmentedControl:UISegmentedControl取消選擇未在代碼識別雖然是在視覺上
How to deselect a segment in Segmented control button permanently till its clicked again
,以允許取消所述控制器當第二次觸摸所選段。
這可以直觀地工作,但是當試圖分配一個UserDefault時,它只是被識別爲被觸摸了兩次的段。
我無法弄清楚我可以添加到子類代碼或viewController代碼,使其工作。
任何幫助,將不勝感激。
子類代碼:
class mySegmentedControl: UISegmentedControl {
@IBInspectable var allowReselection: Bool = true
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let previousSelectedSegmentIndex = self.selectedSegmentIndex
super.touchesEnded(touches, with: event)
if allowReselection && previousSelectedSegmentIndex == self.selectedSegmentIndex {
if let touch = touches.first {
let touchLocation = touch.location(in: self)
if bounds.contains(touchLocation) {
self.sendActions(for: .valueChanged)
self.selectedSegmentIndex = UISegmentedControlNoSegment
}
}
}
}
}
視圖控制器CODE:
所有的@IBOutlet weak var METDome_L: UISegmentedControl!
let key_METDome_L = "METDome_L"
var METD_L: String!
@IBAction func METDome_Lselect(_ sender: Any) {
if METDome_L.selectedSegmentIndex == 0{
METD_L = "1"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 1{
METD_L = "2"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 2{
METD_L = "3"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 3{
METD_L = "4"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else if METDome_L.selectedSegmentIndex == 4{
METD_L = "5"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
else{
METD_L = "NONE"
UserDefaults.standard.set(METD_L, forKey: key_METDome_L)
}
}
沒有關係,但你可以用一條線替換'METDome_Lselect' **的**整個代碼:'UserDefaults.standard.set( 「\(sender.selectedSegmentIndex + 1)」,forKey:key_METDome_L)' 。無論如何,最後的'else'永遠不會被執行。順便說一下,這不是Javascript或PHP。變量名稱應該是* camelCased *而不是* snake_cased *。 – vadian
謝謝@vadian!我知道必須有一種方法來縮短代碼,但從來沒有想過按照你說的方式去做,所以這真的很有幫助。 然而,其他部分是我真正需要工作的代碼。我也嘗試過'如果METDome_L.selectedSegmentIndex == UISegmentedControlNoSegment',但我想這也永遠不會被執行。 關於變量名的說明,大部分我已經使用_camelCased_我只是使用下劃線來分隔變量的各個部分,以便更容易識別,因爲我對編碼相當陌生,而且我很容易因數量而丟失數據的代碼。 –
我懷疑'IBAction'是以編程方式取消選擇控件時觸發的。你可以移動這條線將'NONE'寫入子類 – vadian