Количество IBAction

К примеру в интерфейсе приложения есть несколько аутлетов UIDatePicker (или любой другой UI), один из них задает время отхода ко сну, второй время пробуждения и тд.

Нужно ли для каждого UIDatePicker создавать отдельный IBAction или достаточно создать только один, в котором уже расписать логику для каждого пикера в зависимости от sender? Какой подход считается более грамотным, или разницы нет?


Ответы (2 шт):

Автор решения: Oleg Soloviev

IBAction создается на определенный sender, поэтому да, нужно создать для каждого пикера.

→ Ссылка
Автор решения: NSA-bot

Если несколько пикеров используют одну логику, меняющуюся от какого-то одного параметра, можно использовать один обработчик изменений значений.

Для распознавания, какой именно сработал пикер, можно при инициализации пикера использовать параметр tag. Например:

// Создание первого пикера
  private let firstPicker: UIDatePicker = {
    let picker = UIDatePicker()
    // ... всякие параметры пикера
    // ... всякие параметры пикера
    picker.addTarget(self, action: #selector(pickerChanged), for: .valueChanged)
    picker.tag = 0 // здесь, вместо безликого числа, конечно можно сделать список с именами или константы
    return picker
  }()

// Создание второго пикера
  private let secondPicker: UIDatePicker = {
    let picker = UIDatePicker()
    // ... всякие параметры пикера
    // ... всякие параметры пикера
    picker.addTarget(self, action: #selector(pickerChanged), for: .valueChanged)
    picker.tag = 1 // здесь, вместо безликого числа, конечно можно сделать список с именами или константы
    return picker
  }()

А потом в вашем единственном экшине извлекаете этот tag и на основании его значения делаете то или другое:

@objc private func pickerChanged(_ sender: UIPickerView) {
  print(sender.tag)
  // В соответствии со значением tag делаете всякие нужные вещи
}
→ Ссылка