Как изменить радио-кнопку выбранного изображения и соответствующего текста в Swift iOS - PullRequest
1 голос
/ 26 апреля 2020

Я работаю на Swift. У меня экран с несколькими кнопками с текстом. Каждая кнопка имеет соответствующий текст метки. Из нескольких кнопок одна должна быть выбрана одновременно. Если выбрана кнопка 1, изображение кнопки 1, подлежащее замене с помощью переключателя, и текст кнопки 1 должны быть черного цвета, а оставшиеся должны быть выделены невыделенным светло-серым цветом.

Я добился этого при выполнении ниже, но , Я проверяю, есть ли лучший подход.

@IBAction func selectName(_ sender: UIButton) {
     let myButtonImage = sender.currentImage
    let unSelectedImage = UIImage(named: "un_Checked")

    if sender.tag == 1 && myButtonImage!.pngData() == unSelectedImage!.pngData() { //setting for 1st button
        sender.setImage(UIImage(named: "checked"), for: UIControl.State.normal )
        radioButton4.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButton3.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButton4.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButtonLabel1.textColor = UIColor.darkGray //setting for 1st label
        radioButtonLabel2.textColor = UIColor.lightGray
        radioButtonLabel3.textColor = UIColor.lightGray
        radioButtonLabel4.textColor = UIColor.lightGray
    } else if sender.tag == 2 && myButtonImage!.pngData() == unSelectedImage!.pngData()  {
            sender.setImage(UIImage(named: "checked"), for: UIControl.State.normal ) //setting for 2nd button
            radioButton2.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
            radioButton3.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
            radioButton4.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
            radioButtonLabel2.textColor = UIColor.darkGray //setting for 2nd label
            radioButtonLabel3.textColor = UIColor.lightGray
            radioButtonLabel4.textColor = UIColor.lightGray
            radioButtonLabel1.textColor = UIColor.lightGray
    } else if sender.tag == 3 && myButtonImage!.pngData() == unSelectedImage!.pngData() {
        sender.setImage(UIImage(named: "checked"), for: UIControl.State.normal ) // setting for 3rd button
        radioButton3.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButton1.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButton2.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButton4.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButtonLabel3.textColor = UIColor.darkGray //setting for 3rd label
        radioButtonLabel1.textColor = UIColor.lightGray
        radioButtonLabel2.textColor = UIColor.lightGray
        radioButtonLabel4.textColor = UIColor.lightGray
    } else if sender.tag == 2 && myButtonImage!.pngData() == unSelectedImage!.pngData()  {
            radioButton4.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal) //setting for 4th button
            radioButton1.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
            radioButton2.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
            radioButton3.setImage(UIImage(named: "un_Checked"), for: UIControl.State.normal)
            radioButtonLabel4.textColor = UIColor.darkGray //setting for 4th label
            radioButtonLabel1.textColor = UIColor.lightGray
            radioButtonLabel2.textColor = UIColor.lightGray
            radioButtonLabel3.textColor = UIColor.lightGray
    }

}

Но, по умолчанию первая кнопка, и следует выбрать первую метку.

Есть предложения?

enter image description here

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

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

Объявить переменную:

var currentSelectedIndex = -1

И изменить свою реализацию следующим образом:

@IBAction func selectName(_ sender: UIButton) {

    if (currentSelectedIndex == sender.tag) {
        return
    }
    currentSelectedIndex = sender.tag
    let unSelectedImage = UIImage(named: "un_Checked")

    radioButtonLabel1.textColor = UIColor.lightGray
    radioButtonLabel2.textColor = UIColor.lightGray
    radioButtonLabel3.textColor = UIColor.lightGray
    radioButtonLabel4.textColor = UIColor.lightGray

    radioButton1.setImage(unSelectedImage, for: UIControl.State.normal)
    radioButton2.setImage(unSelectedImage, for: UIControl.State.normal)
    radioButton3.setImage(unSelectedImage, for: UIControl.State.normal)
    radioButton4.setImage(unSelectedImage, for: UIControl.State.normal)

    sender.setImage(UIImage(named: "checked"), for: UIControl.State.normal )

    if currentSelectedIndex == 1 {
        radioButtonLabel1.textColor = UIColor.darkGray
    } else if currentSelectedIndex == 2 {
        radioButtonLabel2.textColor = UIColor.darkGray
    } else if currentSelectedIndex == 3 {
        radioButtonLabel3.textColor = UIColor.darkGray
    } else if currentSelectedIndex == 4 {
        radioButtonLabel4.textColor = UIColor.darkGray
    }
}

Примечания / предложения:

  1. Использование тега не является хорошей идеей
  2. Я бы предложил вам создать пользовательский компонент с этой кнопкой и меткой. И добавьте метод / свойство (bool) к этому компоненту, и если вы передадите ему true или false, он должен соответствующим образом изменить свойства кнопки и метки. Таким образом, ваш код станет чище, и вы сможете использовать его повторно. В текущем формате, если вы добавите больше переключателей, это будет головной болью. (Я вижу, что в некоторых проверках вы меняли одно и то же изображение кнопки дважды, и это может привести к нежелательному поведению).
0 голосов
/ 26 апреля 2020

сначала определите 2 массива для меток радиокнопок и меток

var radioButtonLabels:[UILabel] = []
var radioButtons:[UIButton] = []

теперь вы можете добавлять свои кнопки и метки в эти массивы (например: viewDidLoad ())

radioButtonLabels = [radioButtonLabel1,radioButtonLabel2,radioButtonLabel3,radioButtonLabel14]
radioButtons = [radioButton1,radioButton2,radioButton3,radioButton4]

тогда вы легко сможете изменить свою функцию на такую ​​

@IBAction func selectName(_ sender: UIButton) {
     for (index, element) in radioButtons.enumerated() {
        element.setImage(element.tag == sender.tag ? UIImage(named: "checked") : UIImage(named: "un_Checked"), for: UIControl.State.normal)
        radioButtonLabels[index].textColor = sender.tag ? .darkGray : .lightGray
    }

}
...