【发布时间】:2018-02-20 10:59:30
【问题描述】:
我有两个UIButtons,我想在将数据保存到数据库之前将A/B 值设置为变量。我希望一个按钮在点击时被选中,在另一个按钮被点击时取消选择,反之亦然。以编程方式或在 Interface Builder 中完成此任务的好的解决方案是什么?
【问题讨论】:
-
考虑
UISegmentedControl。
标签: ios swift3 uibutton radio-button
我有两个UIButtons,我想在将数据保存到数据库之前将A/B 值设置为变量。我希望一个按钮在点击时被选中,在另一个按钮被点击时取消选择,反之亦然。以编程方式或在 Interface Builder 中完成此任务的好的解决方案是什么?
【问题讨论】:
UISegmentedControl。
标签: ios swift3 uibutton radio-button
为了设置您提到的“A / B值”,最简单的选择是使用UISwitch或-在可能超过2个选项的一般情况下-UISegmentedControl(如@rmaddy在问题的 cmets 中建议)。
这些控件内置了您正在寻找的“多选一”功能。
开关的缺点是:
如果您仍需要两个单独的 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 上有开源解决方案等...
【讨论】:
试试这个。
首先创建两个单独的按钮@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
}
【讨论】:
你可以像下面这样实现它
我已经为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
}
【讨论】:
在 iOS 中,您必须手动完成。请参阅以下方法,
您可以通过使用界面生成器或以编程方式遵循上述方法。
【讨论】:
您可以使用以下函数来创建单选按钮行为,您必须选择 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
}
}
}
【讨论】: