顯示UIBarButtonItem菜單時獲取事件 [英] Get an event when UIBarButtonItem menu is displayed

查看:0
本文介紹了顯示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屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放