顯示UIBarButtonItem菜單時獲取事件 [英] Get an event when UIBarButtonItem menu is displayed
本文介紹了顯示UIBarButtonItem菜單時獲取事件的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我們都知道如何簡單地點擊一個欄按鈕項來顯示菜單(在iOS 14中引入):
let act = UIAction(title: "Howdy") { act in
print("Howdy")
}
let menu = UIMenu(title: "", children: [act])
self.bbi.menu = menu // self.bbi is the bar button item
到目前為止,一切順利。但是,當輕觸欄按鈕項時,顯示菜單并不是我唯一想做的事情。只要菜單還在顯示,我就需要暫停游戲計時器,以此類推。因此,我需要獲取一個事件,通知我按鈕已被點擊。
我不希望此Tap事件與菜單的產生不同;例如,我不想將目標和操作附加到我的按鈕,因為如果我這樣做,那么菜單產生就是一個不同的事情,只有當用戶長時間按下按鈕時才會發生。我希望菜單顯示在點擊上,和會收到一個事件,告訴我正在發生這種情況。
這肯定是一個常見的問題,那么人們是如何解決它的?
推薦答案
我能找到的唯一方法是使用UIDeferredMenuElement
輕觸菜單執行某些操作。然而,問題是您必須重新創建整個菜單,并將其再次分配給延遲菜單元素的elementProvider
塊中的欄按鈕項,以便獲得未來的點擊事件,如您在下面的玩具示例中所見:
class YourViewController: UIViewController {
func menu(for barButtonItem: UIBarButtonItem) -> UIMenu {
UIMenu(title: "Some Menu", children: [UIDeferredMenuElement { [weak self, weak barButtonItem] completion in
guard let self = self, let barButtonItem = barButtonItem else { return }
print("Menu shown - pause your game timers and such here")
// Create your menu's real items here:
let realMenuElements = [UIAction(title: "Some Action") { _ in
print("Menu action fired")
}]
// Hand your real menu elements back to the deferred menu element
completion(realMenuElements)
// Recreate the menu. This is necessary in order to get this block to
// fire again on future taps of the bar button item.
barButtonItem.menu = self.menu(for: barButtonItem)
}])
}
override func viewDidLoad() {
super.viewDidLoad()
let someBarButtonItem = UIBarButtonItem(systemItem: .done)
someBarButtonItem.menu = menu(for: someBarButtonItem)
navigationItem.rightBarButtonItem = someBarButtonItem
}
}
此外,從iOS 15開始,在UIDeferredMenuElement
上有一個名為uncached(_:)
的類方法,它創建一個延遲的Menu元素,該元素在每次點擊欄按鈕項時觸發其elementProvider
塊,而不是只觸發第一次,這意味著您不必像上例中那樣重新創建菜單。
這篇關于顯示UIBarButtonItem菜單時獲取事件的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!
查看全文