Как обрабатывать события для двух отдельных кнопок в одном методе? - PullRequest
0 голосов
/ 28 марта 2020

У меня есть две кнопки UIB, одна для FM-радио и одна для AM-радио. Когда кнопка FM нажата, я хочу отобразить значения FM для названия станции, частоты и значений ширины полосы в соответствующих ярлыках, а также для AM.

У меня был рабочий код с использованием отдельного метода buttonClick для каждой кнопки, но, поскольку код был идентичен, я хотел попробовать сделать все это внутри одного метода. Эта мерзость ниже!

Вот код прямо сейчас для метода нажатия кнопки.

    @IBAction func buttonClick(_ sender: Any) {
        if buttonFM != nil {
            if myStation.isBandFM() == 1 {
            stationBand.text = "FM1"
            stationName.text = myStation.name //set top left label text to name property of myStation object
                stationFrequency.text = "\(myStation.frequency)"
            }
        } else if buttonAM != nil {
            if myStation.isBandFM() == 0 {
            stationBand.text = "AM1" //final exercise, part 1.
            stationName.text = myStationAM.name
            stationFrequency.text = "\(myStationAM.frequency)"
        }
    }
}

Это весь код контроллера представления:

    class ViewController: UIViewController {

        @IBOutlet weak var stationName: UILabel!
        @IBOutlet weak var stationFrequency: UILabel!
        @IBOutlet weak var stationBand: UILabel!

        @IBOutlet weak var buttonFM: UIButton!
        @IBOutlet weak var buttonAM: UIButton!

        var myStation: RadioStation //FM station

        var myStationAM: RadioStation //AM station

        required init?(coder aDecoder: NSCoder) {
            myStation = RadioStation()  
            myStationAM = RadioStation()
            myStation.frequency = 104.7
            myStationAM.frequency = 800.2
            myStation.name = "FM1"
            myStationAM.name = "AM1"
            super.init(coder: aDecoder)
        }

        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
            stationName.text = nil 
        }

        @IBAction func buttonClick(_ sender: Any) {
        if buttonFM != nil {
            if myStation.isBandFM() == 1 {
            stationBand.text = "FM1"
            stationName.text = myStation.name //set top left label text to name property of myStation object
                stationFrequency.text = "\(myStation.frequency)"
            }
        } else if buttonAM != nil {
            if myStation.isBandFM() == 0 {
            stationBand.text = "AM1" //final exercise, part 1.
            stationName.text = myStationAM.name
            stationFrequency.text = "\(myStationAM.frequency)"
        }
    }
}

И это метод класса :

class RadioStation: NSObject {

    var name: String
    var frequency: Double

    override init() {  //init class method to set default values.
        name = "Default"
        frequency = 100
    }

    static var minAMFFrequency: Double = 520.0
    static var maxAMFFrequency: Double = 1610.0
    static var minFMFFrequency: Double = 88.3
    static var maxFMFFrequency: Double = 107.9

    func isBandFM() -> Int {
        if frequency >= RadioStation.minFMFFrequency && frequency <= RadioStation.maxFMFFrequency {
            return 1 //FM
        } else  {
            return 0 //AM
        }

} 

1 Ответ

0 голосов
/ 28 марта 2020

Я думаю, вы не можете помешать людям писать плохой код. Причина плохого кода в том, что он ломает [S] [O] LID - Разделение проблем, а также открытие / закрытие. Теперь действие кнопки обрабатывает более чем одну проблему.

В любом случае, измените тип отправителя с любого на UIButton, затем проверьте заголовок метки.


    @IBAction func buttonClick(_ sender: UIButton) {
        guard let button = sender.titleLabel?.text else {return}
        if button == buttonFM.title {
            if myStation.isBandFM() == 1 {
            stationBand.text = "FM1"
            stationName.text = myStation.name //set top left label text to name property of myStation object
                stationFrequency.text = "\(myStation.frequency)"
            }
        } else if button == buttonAM.title {
            if myStation.isBandFM() == 0 {
            stationBand.text = "AM1" //final exercise, part 1.
            stationName.text = myStationAM.name
            stationFrequency.text = "\(myStationAM.frequency)"
        }
    }
}

Ты должен думать об этом вот так. Если вы хотите изменить функциональность одной из кнопок в будущем, теперь вам придется изменить действие buttonClick при двух разных обстоятельствах.

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

// Using some abstraction if you decide to make modification
// based on an action you wont need to touch this method anymore. 
// The changes would be made in their corresponding functions. 

    @IBAction func buttonClick(_ sender: UIButton) {

        guard let button = sender.titleLabel?.text else {return}

        if button == buttonFM.title {
               buttonFMClick()
            }
        } else if button == buttonAM.title {
               buttonAMClick()
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...