我正在开发一款应用程序,让我为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,截图如下。您将在下面找到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.
}
}
此致
弗兰克。
答案 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方法处理其选择/取消选择:
告诉委托指定指定索引路径的项目已被选中。
optional func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath)
告诉代理人取消选择指定路径的项目。
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
}