2017-10-14 105 views
1

我有我使用的代碼從該柱子類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) 
    } 
} 
+0

沒有關係,但你可以用一條線替換'METDome_Lselect' **的**整個代碼:'UserDefaults.standard.set( 「\(sender.selectedSegmentIndex + 1)」,forKey:key_METDome_L)' 。無論如何,最後的'else'永遠不會被執行。順便說一下,這不是Javascript或PHP。變量名稱應該是* camelCased *而不是* snake_cased *。 – vadian

+0

謝謝@vadian!我知道必須有一種方法來縮短代碼,但從來沒有想過按照你說的方式去做,所以這真的很有幫助。 然而,其他部分是我真正需要工作的代碼。我也嘗試過'如果METDome_L.selectedSegmentIndex == UISegmentedControlNoSegment',但我想這也永遠不會被執行。 關於變量名的說明,大部分我已經使用_camelCased_我只是使用下劃線來分隔變量的各個部分,以便更容易識別,因爲我對編碼相當陌生,而且我很容易因數量而丟失數據的代碼。 –

+0

我懷疑'IBAction'是以編程方式取消選擇控件時觸發的。你可以移動這條線將'NONE'寫入子類 – vadian

回答

0

首先,如果你繼承你必須使用該類型來獲取增強的功能控制。

@IBOutlet weak var METDome_L: MySegmentedControl! // class names start with a capital letter 

添加屬性selectionKeyUserDefaults保存狀態UISegmentedControlNoSegment(如Int)當控制被取消選擇。如果屬性爲空(必須在使用該子類的視圖控制器中設置),則引發fatal error

class MySegmentedControl: UISegmentedControl { 
    @IBInspectable var allowReselection: Bool = true 

    var selectionKey = "" 

    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 
        guard !selectionKey.isEmpty else { fatalError("selectionKey must not be empty") 
        UserDefaults.standard.set(UISegmentedControlNoSegment, forKey: selectionKey) 
       } 
      } 
     } 
    } 
} 

在您的視圖控制器設置屬性selectionKeyviewDidLoad到自定義按鍵和控制的選中狀態保存到UserDefaultsIBAction。不要任何數學。第一個段是索引爲0的段0。習慣於從零開始的索引。這使恢復選定狀態更方便。

@IBOutlet weak var METDome_L: MySegmentedControl! 
let key_METDome_L = "METDome_L" 

override func viewDidLoad() 
{ 
    super.viewDidLoad() 
    METDome_L.selectionKey = key_METDome_L 
} 

@IBAction func METDome_Lselect(_ sender: UISegmentedControl) { 
    UserDefaults.standard.set(sender.selectedSegmentIndex, forKey: key_METDome_L) 
} 
+0

輝煌!完全是我所需要的!我將'userDefaults'保存爲_strings_的唯一原因是因爲每個段都是數字,當我在下一頁上調用它時,它會顯示數字。但正如你所說,將它們保存爲_Int_值並稍後進行轉換會更加方便。 –

相關問題