如何使两个UIButton像Swift中的单选按钮一样执行?

时间:2017-09-12 05:34:44

标签: ios swift3 uibutton radio-button

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

5 个答案:

答案 0 :(得分:3)

为了设置你提到的“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按钮,GitHub上有开源解决方案......等等。

答案 1 :(得分:1)

试试这个。

首先创建两个单独的@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
}

答案 2 :(得分:0)

你可以像下面那样实现它

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

答案 3 :(得分:0)

您可以使用以下功能创建单选按钮行为,您必须选择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
        }
    }
}

答案 4 :(得分:0)

在iOS中,您必须手动执行此操作。请参阅以下方法,

  1. 使用开关。如果选项指示开/关状态,则使用UISwitch会更好。
  2. 按下按钮时使用相同的方法。每当调用该方法时,取消选择其他按钮/按钮并选择按下的按钮。您可以使用标签或保留按钮的参考来区分它们。
  3. 最后,为每个按钮保留不同的方法。只需按下按钮,即可取消选择其他按钮。
  4. 您可以使用界面生成器或以编程方式执行上述方法。