Swift 4 - Создание общей функции для нескольких кнопок - PullRequest
0 голосов
/ 24 октября 2018

Мне интересно, существует ли более эффективный способ кодирования действия, которое является таким же, за исключением того, какая кнопка была нажата и к какому элементу в структуре она относится.По сути, у меня есть структура из 10 переменных, все из которых имеют логический тип, и у меня есть 10 кнопок.Когда пользователь нажимает кнопку, я хочу проверить, была ли она уже нажата (используя структуру), а затем изменить фон кнопки в зависимости от состояния и изменить состояние.Я скопировал свой текущий код для одной из кнопок, но подумал, что смогу избежать этого 10 раз!

@IBAction func architectureButtonPressed(_ sender: Any) {

        if myInterests.architecture {

             myInterests.architecture = false
             architectureButton.setBackgroundImage(imageUncheckedNarrow, for: .normal)

        } else {

            myInterests.architecture = true
            architectureButton.setBackgroundImage(imageCheckedNarrow, for: .normal)
        }


    }

Ответы [ 3 ]

0 голосов
/ 24 октября 2018
  1. Создайте свои IBOutlet для каждой кнопки.

  2. Создайте массив и сохраните все кнопки, например: var arrayButtons : [UIButton] = []

    arrayButtons.append [button1]

    arrayButtons.append [button2]

    ...

  3. Создать массив логических значений для хранения true/false: var arrayBools : [Bool] = [] и инициализируйте, если какое-либо значение.

Обратите внимание, что индексы arrayButtons и arrayBools должны быть одинаково связаны.

Создание функции выбора для прослушивания сенсорных кнопок.

button.addTarget(self, action: #selector(my_func), for: .touchUpInside)

@objc func my_func(_ sender : UIButton) {

for i in 0...arrayButtons.size-1 {
    if arrayButtons[i] == sender {
        if arrayBooleans[i] {
            arrayBooleans[i] = false
            arrayButtons[i].setImage()
        } else {
            arrayBooleans[i] = true
            arrayButtons[i].setImage()
        }
    }
  }
}
0 голосов
/ 24 октября 2018

Мое предложение состоит в том, чтобы управлять изображениями в Интерфейсном Разработчике через Конфигурацию состояния (Default / Selected)

Затем назначьте уникальный тег, начинающийся со 100, каждой кнопке и установите значение isSelected вIBAction для соответствующего члена структуры в выражении switch:

@IBAction func buttonPressed(_ sender: UIButton) {
    switch sender.tag {
    case 100: myInterests.architecture = sender.isSelected
    case 101: myInterests.art = sender.isSelected

    ...
    default: break
    }

}

В качестве альтернативы используйте собственный KVC Swift с WriteableKeypath

let keypaths : [WritableKeyPath<Interests,Bool>] = [\.architecture, \.art, \.fashion, \.history, \.localCulture, \.music, \.nature, \.shopping, \.sport, \.anything]

@IBAction func buttonPressed(_ sender: UIButton) {
    let index = sender.tag - 100
    let keypath = keypaths[index]
    myInterests[keyPath: keypath] = sender.isSelected
}
0 голосов
/ 24 октября 2018

Хорошо, один простой способ состоит в том, чтобы каждая кнопка UIButton указывала на один и тот же метод ArchitectureButtonPressed IBAction.Поскольку нажатая кнопка передается в метод (отправитель), вы можете обратиться к ее свойству тега, чтобы узнать, какой индекс в вашей структуре должен быть обновлен.(И тогда вы можете захотеть изменить свою структуру, чтобы просто хранить массив из 10 bools, но только на ваше усмотрение.)значение в поле тега кнопки.

...