簡體   English   中英

如何使兩個UIButton像Swift中的單選按鈕一樣執行?

[英]How do I make two UIButtons perform like radio buttons in Swift?

在將數據保存到數據庫之前,我想要使用兩個UIButton來將A / B值設置為變量。 我想要一個按鈕在點擊時被選中,並在點擊另一個按鈕時取消選擇,反之亦然。 以編程方式或在Interface Builder中完成此任務的好方法是什么?

為了設置你提到的“A / B值”,最簡單的選擇是使用UISwitch或-in可能超過2個選項的一般情況 - 一個UISegmentedControl (正如@rmaddy在問題的評論中所建議的那樣)。

這些控件內置了“您只需選擇一個”功能,您正在尋找。

這種開關的缺點是:

  • 它必須是開啟或關閉(不支持選擇狀態“既不是A也不是B”)
  • 每個州都不能有單獨的標題標簽。

如果您仍需要兩個單獨的UIButton實例,則可以:

  • 在視圖控制器中引用兩個按鈕(使用Interface Builder連接@IBOutlet ),例如:

     @IBOutlet weak var leftButton: UIButton! @IBOutlet weak var rightButton: UIButton! 
  • 實現兩個按鈕的操作方法,使其設置所點擊按鈕的選定狀態,並重置另一個按鈕。 例如:

     @IBAction func buttonAction(sender: UIButton) { if sender == leftButton { leftButton.isSelected = true rightButton.isSelected = false } else if sender == rightButton{ leftButton.isSelected = false rightButton.isSelected = true } } 

對於兩個按鈕,這是一個快速而骯臟的解決方案。 如果你想要一個通用的n-button 無線電組 ,GitHub上有開源解決方案......

試試這個。

首先創建兩個單獨的@IBOutlet按鈕。

@IBOutlet weak var btnYes: UIButton!
@IBOutlet weak var btnNo: UIButton!

設置兩個按鈕標簽像這樣,您還可以使用故事板設置標簽。

override func viewDidLoad() {
      super.viewDidLoad()

    btnYes.tag = 1
    btnNo.tag = 2
}

為兩個按鈕實現Common @IBAction方法

@IBAction func btnYesNoTapped(_ sender: UIButton) {
        if sender.tag == 1 {
            self.IsBtnSelected(isSelect: true, with: self.btnYes)
        }else {
            self.IsBtnSelected(isSelect: true, with: self.btnNo)
        }

}

創建客戶方法

func IsBtnSelected(isSelect:Bool,with sender:UIButton){
        self.btnYes.isSelected = false
        self.btnNo.isSelected = false
        sender.isSelected = isSelect
}

你可以像下面這樣實現它

我已經為TableView日期實現了它,您只需要做一些修改

enum filterDateSelectableOptions:Int {
    case AssignDate
    case DueDate
    case CompletionDate

}
//Assign Date selected by default 
var currentSelectedFilterDate:filterDateSelectableOptions = .AssignDate

現在

func btnRadioButtonTapped(sender:UIButton) {

    switch sender.tag {
    case kTableViewRow.AssignDate.rawValue:
        self.currentSelectedFilterDate = .AssignDate

    case kTableViewRow.DueDate.rawValue:
        self.currentSelectedFilterDate = .DueDate

    case kTableViewRow.CompletionDate.rawValue :
        self.currentSelectedFilterDate = .CompletionDate
    default:
        break;
    }
    //sender.isSelected = !sender.isSelected
    self.tblFilterList.reloadData()
}

cellForRow我有

          // THIS IS DIFFERENT ENUM SO +1 is required in my case
     case .AssignDate,.DueDate,.CompletionDate :
        let button = buttonRadioCircle
        button.tag = row.rawValue
        cell.accessoryView = button
        button.addTarget(self, action: #selector(btnRadioButtonTapped(sender:)), for: .touchUpInside)


        button.isSelected = self.currentSelectedFilterDate.rawValue + 1 == row.rawValue
    }

你可以使用以下功能來創建一個單選按鈕行為,你必須選擇btn outlet和兩個出口的數組到這個功能。 而不是顏色,你也可以比較圖像和設置圖像。 獲取所需的值你可以在viewcontroller中創建一個變量,並在btn的IBAction中為這個變量賦值,你可以從IBAction調用這個函數。

func radioButton(_ btnToBeSelected: UIButton, _ btnArray: [UIButton]) {
    for btn in btnArray {
        if btn == btnToBeSelected {
            btn.backgroundColor = UIColor.black
            //selected btn
            //You can also set btn images by 
            //btn.setImage(<#T##image: UIImage?##UIImage?#>, for: <#T##UIControlState#>)
        } else {
            btn.backgroundColor = UIColor.red
            //not selected btn
        }
    }
}

在iOS中,您必須手動執行此操作。請參閱以下方法,

  1. 使用開關。 如果選項指示開/關狀態,則使用UISwitch會更好。
  2. 按下按鈕時使用相同的方法。 每當調用該方法時,取消選擇其他按鈕/按鈕並選擇按下的按鈕。 您可以使用標簽或保留按鈕的參考來區分它們。
  3. 最后,為每個按鈕保留不同的方法。 只需按下按鈕,即可取消選擇其他按鈕。

您可以使用界面生成器或以編程方式遵循上述方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM