单选按钮组 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 的教程可在以下位置找到:

https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/CreateATableView.html


管理一组 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

}