Почему новый синтаксис действий UIControl iOS 14 такой ужасный? - PullRequest
2 голосов
/ 06 августа 2020

Новое в iOS 14, мы можем прикрепить обработчик действий непосредственно к UIControl:

    let action = UIAction(title:"") { action in
        print("howdy!")
    }
    button.addAction(action, for: .touchUpInside)

Это в своем роде круто, но синтаксис выводит из себя. Сначала я должен сформировать UIAction. Я должен дать UIAction название, даже если оно никогда не появится в интерфейсе. Нет лучшего способа?

1 Ответ

2 голосов
/ 06 августа 2020

Во-первых, вам не нужно указывать заголовок. Это (сейчас) законно:

    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 в этой истории? Это внутри акции . UIAction имеет свойство sender. Итак, в этом коде action.sender - это UIButton.]

...