Если выбран UIButton, отмените выбор другого UIButton в Swift (Xcode 9)

Я работаю над приложением, которое заставляет меня выбирать разные цвета для некоторых светодиодов в 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, снимок экрана ниже. Если выбран UIButton, отмените выбор другого UIButton в Swift (Xcode 9)

Ниже вы найдете код для 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.
}

}

Искренне,

Откровенный.

Как вы назначаете этот класс UIButton? Из раскадровки или кода?

Jay Patel 28.03.2018 11:51

@JD. Я добавил ответ выше.

Frank 28.03.2018 12:01

Возможно, вы можете использовать логику радиокнопки. Если я не ошибаюсь, вам нужна именно такая логика. Если вам нужна моя логика реализации переключателя. пожалуйста, спросите об этом.

Abhirajsinh Thakore 28.03.2018 12:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
5 177
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я бы создал массив ToggleTheButtons:

@IBOutlet var toggleButtons : [ToggleTheButtons]!

и подключите все кнопки к этой коллекции. Когда кнопка нажата, вы можете деактивировать все кнопки в этом массиве, кроме той, которая была нажата. Для этого вы даже можете подумать об уменьшении количества @IBAction до 1, подключить все кнопки к одному и тому же методу и использовать sender для фильтрации одной кнопки, которую вы должны активировать.

За отличный ответ. +1

Krunal 28.03.2018 12:36

@Krunal Я думаю, что ответ JD лучший (теоретически), но по какой-то причине он удалил его: /

luk2302 28.03.2018 13:03

@ luk2302 Спасибо за ответ. Все кнопки теперь подключены к массиву. Что вы имеете в виду с @IBAction и отправителями?

Frank 28.03.2018 14:49

В соответствии с вашим макетом раскадровки и вашими требованиями у меня для вас есть совершенно другое решение.

Вы можете использовать UICollectionView только с разрешением на выбор одной ячейки, если вы можете управлять своим дизайном (сетка 3 x 3) с помощью представления коллекции.

Установите кнопки внутри 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!

}
Ответ принят как подходящий

Попробуй это

- 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?

Frank 28.03.2018 13:29

Вы можете установить значение тега кнопки с помощью "button.tag = 1" или в инспекторе атрибутов в Stroyboard есть опция.

Lenin 28.03.2018 13:31

Прохладный. Значит, все кнопки должны быть связаны с одним действием с одним и тем же именем?

Frank 28.03.2018 13:39

Да, та же функция IBAction

Lenin 28.03.2018 13:43

Прохладный. Это сработало! Теперь перейдем к изменению текста при нажатии кнопки :)

Frank 28.03.2018 16:05

Просто используйте оператор 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

Эта опция помогает сэкономить строки кода.

Другие вопросы по теме