【问题标题】:How do I make two UIButtons perform like radio buttons in Swift?如何让两个 UIButton 像 Swift 中的单选按钮一样执行?
【发布时间】:2018-02-20 10:59:30
【问题描述】:

我有两个UIButtons,我想在将数据保存到数据库之前将A/B 值设置为变量。我希望一个按钮在点击时被选中,在另一个按钮被点击时取消选择,反之亦然。以编程方式或在 Interface Builder 中完成此任务的好的解决方案是什么?

【问题讨论】:

  • 考虑UISegmentedControl

标签: ios swift3 uibutton radio-button


【解决方案1】:

为了设置您提到的“A / B值”,最简单的选择是使用UISwitch或-在可能超过2个选项的一般情况下-UISegmentedControl(如@rmaddy在问题的 cmets 中建议)。

这些控件内置了您正在寻找的“多选一”功能。

开关的缺点是:

  • 必须打开或关闭(不支持“既不是 A 也不是 B”的选择状态)
  • 每个州不能有单独的标题标签。

如果您仍需要两个单独的 UIButton 实例,您可以:

  • 引用视图控制器中的两个按钮(@IBOutlets 使用 Interface Builder 连接),例如:

    @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
        }
    }
    

这是一个只需要两个按钮的快速而简单的解决方案。如果你想要一个通用的 radio group 按钮,GitHub 上有开源解决方案等...

【讨论】:

    【解决方案2】:

    试试这个。

    首先创建两个单独的按钮@IBOutlet。

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

    像这样设置两个按钮标签,您还可以使用情节提要设置标签。

    override func viewDidLoad() {
          super.viewDidLoad()
    
        btnYes.tag = 1
        btnNo.tag = 2
    }
    

    为两个按钮实现通用@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
    }
    

    【讨论】:

      【解决方案3】:

      你可以像下面这样实现它

      我已经为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
          }
      

      【讨论】:

        【解决方案4】:

        在 iOS 中,您必须手动完成。请参阅以下方法,

        1. 使用开关。如果选项指示开/关状态,则使用 UISwitch 会更好。
        2. 按下按钮时使用相同的方法。每当调用该方法时,取消选择其他按钮/按钮并选择按下的按钮。您可以使用标签或保留对按钮的引用来区分它们。
        3. 最后,为每个按钮保留不同的方法。只要按下按钮就取消选择其他按钮。

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

        【讨论】:

          【解决方案5】:

          您可以使用以下函数来创建单选按钮行为,您必须选择 btn 插座并将两个插座的数组用于此功能。除了颜色,您还可以比较图像和设置图像。为了获得所需的值,您可以在 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
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2011-01-22
            • 1970-01-01
            • 2021-02-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-11-26
            相关资源
            最近更新 更多