如果选择了UIButton,则取消选择Swift中的其他UIButton(Xcode 9)

时间:2018-03-28 09:25:47

标签: ios swift uibutton uikit

我正在开发一款应用程序,让我为Arduino Uno中的某些LED选择不同的颜色。现在,我有点陷入代码中。

如果选择了一个按钮(颜色),则应取消选择另一个按钮,因为一次只能有一种颜色。请看下面的代码。下面的代码是一个子类,所有按钮都与之连接。

import UIKit

class ToggleTheButtons: UIButton {

// Buttons are all off on load.
var isOn = false

override init(frame: CGRect) {

    super.init(frame: frame)
    initButton()

}

required init?(coder aDecoder: NSCoder){

    super.init(coder:aDecoder)
    initButton()

}

func initButton(){
    // Initializes the button.
    layer.borderWidth = 0.0

    addTarget(self, action: #selector(ToggleTheButtons.buttonPressed),    for: .touchUpInside)

}

// What happens when we press the buttons.
@objc func buttonPressed() {

    activateButton(bool: !isOn)

}

// Toggles button on and off.
func activateButton(bool: Bool) {

    isOn = bool

    // Ternary operator. true:false (Boolean is nodig)
    _ = bool ? (layer.borderWidth = 2.0) : (layer.borderWidth = 0.0)
    //        layer.borderColor = (borderColorOfTheButton as! CGColor)


}

}

由于我仍然在研究我的技能,你可能会在这里找到一些奇怪的代码。如果您发现错误,请给我任何反馈。

我期待着阅读你的回复。

编辑:我通过IBActions链接了我的UIButtons,截图如下。 Screenshot of main.storyboard

您将在下面找到licht.swift的代码。这里的按钮是链接的。

import UIKit

class Licht: UIViewController {

// Link alle knoppen met de code. Check ToggleTheButtons.swift voor de     toggle functies. Misschien een IBAction.
//    @IBOutlet weak var redButton: ToggleTheButtons!

@IBAction func redButton(_ sender: ToggleTheButtons) {
}
@IBAction func orangeButton(_ sender: ToggleTheButtons) {
}

@IBAction func yellowButton(_ sender: ToggleTheButtons) {
}

@IBAction func greenButton(_ sender: ToggleTheButtons) {
}

@IBAction func lightBlueButton(_ sender: ToggleTheButtons) {
}

@IBAction func darkBlueButton(_ sender: ToggleTheButtons) {
}

@IBAction func purpleButton(_ sender: ToggleTheButtons) {
}

@IBAction func pinkButton(_ sender: ToggleTheButtons) {
}

@IBAction func whiteButton(_ sender: ToggleTheButtons) {
}




override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

    func databaseConnection() {

        // Hier komt de connectie met de database. 

    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

此致

弗兰克。

6 个答案:

答案 0 :(得分:2)

试试这个

- Set tag to all UIButton (1 - 9)
- Set borderWidth to all Buttons
- Connect all the button to the below mentioned IBAction

@IBAction func didTapButton(_ sender: UIButton) {
    for button in self.view.subviews as [UIView] {
        if button is UIButton {
             // Do whatever you want
             button.layer.borderColor = button.tag == sender.tag ? UIColor.blue.cgColor : UIColor.lightGray.cgColor
        }
    }
}

已经完成了

答案 1 :(得分:2)

只需使用switch语句:

switch sender { case firstButton: firstButton.isSelected = true secondButton.isSelected = false thirdButton.isSelected = false case secondButton: secondButton.isSelected = true firstButton.isSelected = false thirdButton.isSelected = false case thirdButton: thirdButton.isSelected = true secondButton.isSelected = false thirdButton.isSelected = false default: print("Error") }

答案 2 :(得分:1)

我会创建一个ToggleTheButtons的数组:

@IBOutlet var toggleButtons : [ToggleTheButtons]!

并将所有按钮连接到该集合 按下按钮时,您可以取消激活该阵列中的所有按钮。为此,您甚至可以考虑将@IBAction的数量减少为1并将所有按钮连接到同一方法,并使用sender过滤掉您必须激活的一个按钮。

答案 3 :(得分:1)

根据您的故事板布局设计和您的要求,我为您提供了完全不同的解决方案。

如果您可以使用集合视图管理您的设计(网格3 x 3),则只能使用UICollectionView单细胞选择权限。

UICollectionViewCell内设置按钮并使用UICollectionViewDelegate方法处理其选择/取消选择:

collectionView(_:didSelectItemAt:)

告诉委托指定指定索引路径的项目已被选中。

optional func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)

collectionView(_:didDeselectItemAt:)

告诉代理人取消选择指定路径的项目。

optional func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath)


试一试,看看:

class ViewController: UIViewController, UICollectionViewDelegate, UICollectionViewDataSource {

    @IBOutlet var collection: UICollectionView?

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ButtonCell", for: indexPath) as! ButtonsCell
        cell.button.isSelected = cell.isSelected  // handle button selection 
        // or for your toggle button
        // cell.button.isOn = cell.isSelected
        return cell
    }

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as? ButtonsCell
        cell?.button.isSelected = true  // select button

        // or for your toggle button
        // cell.button.isOn = true
    }

    func collectionView(_ collectionView: UICollectionView, didDeselectItemAt indexPath: IndexPath) {
        let cell = collectionView.cellForItem(at: indexPath) as? ButtonsCell
        cell?.button.isSelected = false  // deselect button

        // or for your toggle button
        // cell.button.isOn = false
    }

}

// UICollectionViewCell class with your button
class ButtonsCell: UICollectionViewCell {

    @IBOutlet weak var button: ToggleTheButtons!

}

答案 4 :(得分:0)

最简单的方法是前面提到的方法:

    zeroPctButton.isSelected = false
    tenPctButton.isSelected = false
    twentyPctButton.isSelected = false
    
    sender.isSelected = true

此选项有助于保存代码行。

答案 5 :(得分:-1)

简单来说,当您想要选择一个按钮时,请尝试以下操作:

将所有按钮连接到一个IBAaction

 @IBAction func allButtons (_ sender: UIButton) {
        
        firstButton.isSelected = false
        secondButton.isSelected = false
        thirdButton.isSelected = false
        sender.isSelected = true
}