Почему новый синтаксис действий UIControl в iOS 14 такой ужасный?
Новое в iOS 14, мы можем прикрепить обработчик действия непосредственно к UIControl:
let action = UIAction(title:"") { action in
print("howdy!")
}
button.addAction(action, for: .touchUpInside)
Это по-своему круто, но синтаксис бесит. Сначала я должен сформировать UIAction. Я должен дать UIAction название, даже если оно никогда не появится в интерфейсе. Нет лучшего способа?
1 ответ
Во-первых, вам не нужно указывать заголовок. Это (сейчас) законно:
let action = UIAction { action in
print("howdy!")
}
button.addAction(action, for: .touchUpInside)
Во-вторых, вам действительно не нужна отдельная строка для определения действия, поэтому вы можете сказать следующее:
button.addAction(.init { action in
print("howdy!")
}, for: .touchUpInside)
Однако это все еще бесит, потому что теперь у меня есть закрытие в середине addAction
вызов. Это должно быть конечное закрытие! Очевидное решение - расширение:
extension UIControl {
func addAction(for event: UIControl.Event, handler: @escaping UIActionHandler) {
self.addAction(UIAction(handler:handler), for:event)
}
}
Задача решена! Теперь я могу говорить так, как мне всегда было позволено:
button.addAction(for: .touchUpInside) { action in
print("howdy!")
}
[Дополнительная информация: Где sender
в этой истории? Это внутри действия. У МАУ естьsender
свойство. Итак, в этом кодеaction.sender
является UIButton.]