Я работаю над приложением, которое заставляет меня выбирать разные цвета для некоторых светодиодов в Arduino Uno. Теперь я немного застрял в коде.
Если выбрана одна кнопка, которая является цветом, с другой кнопки следует отменить выбор, потому что вы можете иметь только один цвет за раз. Пожалуйста, взгляните на приведенный ниже код. Приведенный ниже код является подклассом, к которому связаны все кнопки.
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)
}
}
Поскольку я все еще работаю над своими навыками, вы можете найти здесь странный код. Пожалуйста, дайте мне отзывы об обнаруженных вами ошибках.
С нетерпением жду ваших ответов.
Обновлено: Я связал свои UIButtons через IBActions, снимок экрана ниже.

Ниже вы найдете код для 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.
}
}
Искренне,
Откровенный.
@JD. Я добавил ответ выше.
Возможно, вы можете использовать логику радиокнопки. Если я не ошибаюсь, вам нужна именно такая логика. Если вам нужна моя логика реализации переключателя. пожалуйста, спросите об этом.





Я бы создал массив ToggleTheButtons:
@IBOutlet var toggleButtons : [ToggleTheButtons]!
и подключите все кнопки к этой коллекции.
Когда кнопка нажата, вы можете деактивировать все кнопки в этом массиве, кроме той, которая была нажата. Для этого вы даже можете подумать об уменьшении количества @IBAction до 1, подключить все кнопки к одному и тому же методу и использовать sender для фильтрации одной кнопки, которую вы должны активировать.
За отличный ответ. +1
@Krunal Я думаю, что ответ JD лучший (теоретически), но по какой-то причине он удалил его: /
@ luk2302 Спасибо за ответ. Все кнопки теперь подключены к массиву. Что вы имеете в виду с @IBAction и отправителями?
В соответствии с вашим макетом раскадровки и вашими требованиями у меня для вас есть совершенно другое решение.
Вы можете использовать UICollectionView только с разрешением на выбор одной ячейки, если вы можете управлять своим дизайном (сетка 3 x 3) с помощью представления коллекции.
Установите кнопки внутри 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!
}
Попробуй это
- 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
}
}
}
Это сделано
Спасибо за ответ. Что вы имеете в виду под установкой тега для всех UIButton? Следует ли поместить @IBAction в файл подкласса .swift?
Вы можете установить значение тега кнопки с помощью "button.tag = 1" или в инспекторе атрибутов в Stroyboard есть опция.
Прохладный. Значит, все кнопки должны быть связаны с одним действием с одним и тем же именем?
Да, та же функция IBAction
Прохладный. Это сработало! Теперь перейдем к изменению текста при нажатии кнопки :)
Просто используйте оператор 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")
}
Просто, когда вы хотите выбрать кнопку, попробуйте следующее:
Подключите все кнопки к одному действию IBA
@IBAction func allButtons (_ sender: UIButton) {
firstButton.isSelected = false
secondButton.isSelected = false
thirdButton.isSelected = false
sender.isSelected = true
}
Самый простой способ - упомянутый ранее:
zeroPctButton.isSelected = false
tenPctButton.isSelected = false
twentyPctButton.isSelected = false
sender.isSelected = true
Эта опция помогает сэкономить строки кода.
Как вы назначаете этот класс UIButton? Из раскадровки или кода?