Почему новый синтаксис действий 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.]

Другие вопросы по тегам