单选按钮组 Swift 3 Xcode 8
Radio Button Group Swift 3 Xcode 8
我搜索了各种资源,但找不到一个清晰简单的解决方案,用于在 Swift 3 和 Xcode 8.3 中为 iOS 应用程序创建等效的单选按钮组.
例如,如果我在一组中有 3 个按钮,并且一次只能选择一个。目前,我正在通过将组中 2 个按钮的状态更改为在另一个按钮被选中时未被选中来实现此目的,反之亦然。
@IBAction func buttonA(_ sender: Any) {
buttonB.isChecked = false
buttonC.isChecked = false
}
@IBAction func buttonB(_ sender: Any) {
buttonA.isChecked = false
buttonC.isChecked = false
}
@IBAction func buttonC(_ sender: Any) {
buttonA.isChecked = false
buttonB.isChecked = false
}
不过我希望有一种更有效的方法来做到这一点。
任何有关更有效解决方案的帮助将不胜感激。
您可以将所有按钮的 IBAction
连接到一个方法。
@IBAction func buttonClick(_ sender: UISwitch) { // you're using UISwitch I believe?
}
您应该将所有按钮添加到一个数组中:
// at class level
var buttons: [UISwitch]!
// in viewDidLoad
buttons = [buttonA, buttonB, buttonC]
然后,这样写buttonClick
方法:
buttons.forEach { [=12=].isChecked = false } // uncheck everything
sender.isChecked = true // check the button that is clicked on
备选方案:
尝试使用 UITableView
。每行包含一个选项。选择一行后,将该行的 accessoryType
更改为 .checkMark
,每隔一行更改为 .none
。
如果你太懒了,试试在 cocoapods.org
上搜索,看看其他人做了什么。
根据您的 UI,您可以采用多种方法。
UITableView - 使用带有复选标记装饰器的 UITableView
。如果您对这些单选按钮的布局相当传统,那么这是正确的范例。如果布局是网格而不是列表,您可以使用 UICollectionView
.
您可以使用 UITableViewDelegate
中的 func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int)
来捕获选择。当您想要提交更改以确定选择了哪个单元格时,您可以在 tableView 上调用 indexPathForSelectedRow
。
Apple 关于 UITableView 的教程可在以下位置找到:
管理一组 UIButtons - 您可以存储对作为单选按钮组一部分的 UIButton 对象的引用数组。
protocol RadioButtonDelegate: class {
func didTapButton(_ button: UIButton)
}
class RadioButtonGroup {
private var buttons: [UIButton] = []
weak var delegate: RadioButtonDelegate?
var selectedButton: UIButton? { return buttons.filter { [=10=].isSelected }.first }
func addButton(_ button: UIButton) {
buttons.append(button)
}
@objc private func didTapButton(_ button: UIButton) {
button.isSelected = true
deselectButtonsOtherThan(button)
delegate?.didTapButton(button)
}
private func deselectButtonsOtherThan(_ selectedButton: UIButton) {
for button in buttons where button != selectedButton {
button.isSelected = false
}
}
}
class MyView: UIView {
private var radioButtonGroup = RadioButtonGroup()
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let button1 = UIButton(type: .custom)
button1.setTitle("Eeeny", for: .normal)
let button2 = UIButton(type: .custom)
button2.setTitle("Meeny", for: .normal)
let button3 = UIButton(type: .custom)
button3.setTitle("Miny", for: .normal)
self.radioButtonGroup.addButton(button1)
self.radioButtonGroup.addButton(button2)
self.radioButtonGroup.addButton(button3)
addSubview(button1)
addSubview(button2)
addSubview(button3)
}
}
只需为所有三个按钮的 touchUpInside 事件制作一个选择器,并在您的 IB 中为正常状态设置 radio_off 图像,为选择状态设置 radio_on 图像,然后只需连接 btnClicked 方法所有按钮的 touchUpInside 事件
class ViewController: UIViewController {
@IBOutlet weak var btnFirst:UIButton!
@IBOutlet weak var btnSecond:UIButton!
@IBOutlet weak var btnThird:UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func btnClicked(sender:UIButton){
let buttonArray = [btnFirst,btnSecond,btnThird]
buttonArray.forEach{
[=10=]?.isSelected = false
}
sender.isSelected = true
}
我搜索了各种资源,但找不到一个清晰简单的解决方案,用于在 Swift 3 和 Xcode 8.3 中为 iOS 应用程序创建等效的单选按钮组.
例如,如果我在一组中有 3 个按钮,并且一次只能选择一个。目前,我正在通过将组中 2 个按钮的状态更改为在另一个按钮被选中时未被选中来实现此目的,反之亦然。
@IBAction func buttonA(_ sender: Any) {
buttonB.isChecked = false
buttonC.isChecked = false
}
@IBAction func buttonB(_ sender: Any) {
buttonA.isChecked = false
buttonC.isChecked = false
}
@IBAction func buttonC(_ sender: Any) {
buttonA.isChecked = false
buttonB.isChecked = false
}
不过我希望有一种更有效的方法来做到这一点。
任何有关更有效解决方案的帮助将不胜感激。
您可以将所有按钮的 IBAction
连接到一个方法。
@IBAction func buttonClick(_ sender: UISwitch) { // you're using UISwitch I believe?
}
您应该将所有按钮添加到一个数组中:
// at class level
var buttons: [UISwitch]!
// in viewDidLoad
buttons = [buttonA, buttonB, buttonC]
然后,这样写buttonClick
方法:
buttons.forEach { [=12=].isChecked = false } // uncheck everything
sender.isChecked = true // check the button that is clicked on
备选方案:
尝试使用 UITableView
。每行包含一个选项。选择一行后,将该行的 accessoryType
更改为 .checkMark
,每隔一行更改为 .none
。
如果你太懒了,试试在 cocoapods.org
上搜索,看看其他人做了什么。
根据您的 UI,您可以采用多种方法。
UITableView - 使用带有复选标记装饰器的 UITableView
。如果您对这些单选按钮的布局相当传统,那么这是正确的范例。如果布局是网格而不是列表,您可以使用 UICollectionView
.
您可以使用 UITableViewDelegate
中的 func table(_ table: WKInterfaceTable, didSelectRowAt rowIndex: Int)
来捕获选择。当您想要提交更改以确定选择了哪个单元格时,您可以在 tableView 上调用 indexPathForSelectedRow
。
Apple 关于 UITableView 的教程可在以下位置找到:
管理一组 UIButtons - 您可以存储对作为单选按钮组一部分的 UIButton 对象的引用数组。
protocol RadioButtonDelegate: class {
func didTapButton(_ button: UIButton)
}
class RadioButtonGroup {
private var buttons: [UIButton] = []
weak var delegate: RadioButtonDelegate?
var selectedButton: UIButton? { return buttons.filter { [=10=].isSelected }.first }
func addButton(_ button: UIButton) {
buttons.append(button)
}
@objc private func didTapButton(_ button: UIButton) {
button.isSelected = true
deselectButtonsOtherThan(button)
delegate?.didTapButton(button)
}
private func deselectButtonsOtherThan(_ selectedButton: UIButton) {
for button in buttons where button != selectedButton {
button.isSelected = false
}
}
}
class MyView: UIView {
private var radioButtonGroup = RadioButtonGroup()
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
let button1 = UIButton(type: .custom)
button1.setTitle("Eeeny", for: .normal)
let button2 = UIButton(type: .custom)
button2.setTitle("Meeny", for: .normal)
let button3 = UIButton(type: .custom)
button3.setTitle("Miny", for: .normal)
self.radioButtonGroup.addButton(button1)
self.radioButtonGroup.addButton(button2)
self.radioButtonGroup.addButton(button3)
addSubview(button1)
addSubview(button2)
addSubview(button3)
}
}
只需为所有三个按钮的 touchUpInside 事件制作一个选择器,并在您的 IB 中为正常状态设置 radio_off 图像,为选择状态设置 radio_on 图像,然后只需连接 btnClicked 方法所有按钮的 touchUpInside 事件
class ViewController: UIViewController {
@IBOutlet weak var btnFirst:UIButton!
@IBOutlet weak var btnSecond:UIButton!
@IBOutlet weak var btnThird:UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@IBAction func btnClicked(sender:UIButton){
let buttonArray = [btnFirst,btnSecond,btnThird]
buttonArray.forEach{
[=10=]?.isSelected = false
}
sender.isSelected = true
}