iOS 14 настраивает меню UIBarButttonItem перед его открытием

Поскольку iOS14 предлагает простой способ настройки меню на UIBarButtonItem, Интересно, не скучаю ли я, что нет простого способа настроить его элементы, поскольку они могут зависеть от текущего контекста.

Я вижу что есть UIDeferredMenuElement, но это не похоже на хороший вариант использования?

Также я вижу, что есть primaryAction, но, похоже, нет тривиального способа вызвать меню оттуда.

И третий вариант, кажется, перетасовывает меню при каждом изменении, которое может повлиять на него, но это не кажется хорошей идеей.

Я предполагаю, что я что-то упускаю.

2 ответа

Как правило, для простых кнопок на панели такого положения нет. UIControl, как UIButton, имеет событие.menuActionTriggered, и в этот момент вполне разумно создать и назначить меню элементу управления, тем самым реализовав динамическое меню, которое создается непосредственно перед появлением меню.

Но вы не можете сделать это с помощью элемента кнопки панели - если это не пользовательский элемент кнопки панели просмотра с UIButton в нем.

В противном случае вам пришлось бы наблюдать за окружающими условиями с помощью какого-либо другого механизма и просто менять меню элемента панели каждый раз, когда условия меняются. Звучит как заноза в заднице, но, вероятно, это ваш единственный вариант. (Насколько я понимаю, именно это вы имеете в виду, когда говорите: "И третий вариант, кажется, перетасовывает меню при каждом изменении, которое может повлиять на него, но это не кажется хорошей идеей".)

Я думаю, что то, о чем вы просите, разумно, и кажется глупым, что для этого нет возможности; Если у вас есть хороший вариант использования, я бы рекомендовал подать запрос на улучшение в Apple.

Вот версия реализации Swift 5, вдохновленная ответом @matt.

      private func setButton() {
    button.menu = UIMenu() // Here must be a placeholder menu. As the menu won't show if button.menu is nil.
    button.showsMenuAsPrimaryAction = true
    button.addTarget(self, action: #selector(createMenu(_:)), for: .menuActionTriggered)
}

@objc private func createMenu(_ button:UIButton) {
    ...
}

На данный момент это единственное решение. В виде func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) не вызывается каждый раз, если вы не удерживаете какое-то время, когда кнопка установлена ​​на showsMenuAsPrimaryAction = true.

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