4 votes

iOS 14 configure le menu UIBarButttonItem avant son ouverture

Comme iOS14 offre un moyen facile de configurer le menu sur le UIBarButtonItem Je me demande si j'ai raté le fait qu'il n'y a pas de moyen facile de configurer ses éléments car ils peuvent dépendre du contexte actuel.

Je vois qu'il y a UIDeferredMenuElement mais cela ne semble pas être un bon cas d'utilisation ?

Je vois aussi qu'il y a primaryAction mais il ne semble pas y avoir de moyen trivial d'appeler le menu à partir de là.

Et la troisième option semble être de remanier le menu à chaque changement qui pourrait l'affecter, mais cela ne semble pas être une bonne idée.

Je suppose qu'il y a quelque chose qui m'échappe.

2voto

matt Points 60113

En fait, pour un simple bouton de barre, il n'y a pas de disposition de ce type. Un UIControl comme un UIButton possède un événement .menuActionTriggered et il est parfaitement raisonnable, à ce moment-là, de construire et d'affecter le menu à la commande, ce qui permet de mettre en œuvre un menu dynamique qui est construit juste à l'instant où le menu apparaît.

Mais vous ne pouvez pas le faire avec un élément de bouton de barre - à moins qu'il ne s'agisse d'un élément de bouton de barre de vue personnalisé contenant un UIButton.

Ce qu'il faudrait faire autrement, c'est surveiller les conditions environnantes par le biais d'un système d'alerte. autre et il suffit de modifier le menu de l'élément du bouton de la barre chaque fois que les conditions changent. Cela semble être une corvée mais c'est probablement votre seule option. (Je suppose que c'est exactement ce que vous voulez dire quand vous dites "Et la troisième option semble être de remanier le menu à chaque changement qui peut l'affecter, mais cela ne semble pas être une bonne idée").

Je pense que ce que vous demandez est raisonnable et il semble un peu idiot qu'il n'y ait aucune disposition à ce sujet ; si vous avez un bon cas d'utilisation, je recommanderais de déposer une demande d'amélioration auprès d'Apple.

0voto

Owen Zhao Points 339

Voici la version Swift 5 de l'implémentation, inspirée par la réponse de @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) {
    ...
}

C'est la seule solution jusqu'à présent. Comme func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?) ne s'appelle pas à chaque fois, sauf si vous maintenez la touche enfoncée pendant un moment lorsqu'un bouton est réglé sur showsMenuAsPrimaryAction = true .

----edited----

Si ma réponse est correcte, alors celle de Matt l'est aussi. Comme mon code était basé sur son idée. Donc je ne pensais pas que Matt avait tort en premier lieu. Je pensais juste que le questionneur avait mal compris la réponse de Matt.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X