Количество IBAction
К примеру в интерфейсе приложения есть несколько аутлетов UIDatePicker (или любой другой UI), один из них задает время отхода ко сну, второй время пробуждения и тд.
Нужно ли для каждого UIDatePicker создавать отдельный IBAction или достаточно создать только один, в котором уже расписать логику для каждого пикера в зависимости от sender? Какой подход считается более грамотным, или разницы нет?
Ответы (2 шт):
IBAction создается на определенный sender, поэтому да, нужно создать для каждого пикера.
Если несколько пикеров используют одну логику, меняющуюся от какого-то одного параметра, можно использовать один обработчик изменений значений.
Для распознавания, какой именно сработал пикер, можно при инициализации пикера использовать параметр 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 делаете всякие нужные вещи
}