簡體   English   中英

Swift - 如何使用 UILongPressGestureRecognizer 獲取一組按鈕的發件人標簽?

[英]Swift - How to get the sender tag for an array of buttons using UILongPressGestureRecognizer?

我在 storyboard 中有一些按鈕,我將它們放入了參考插座集合中。 我對所有這些按鈕都使用了 UITapGestureRecognizer 和 UILongPressGestureRecognizer,但是我怎樣才能准確地打印出哪個按鈕被點擊了呢? 貝婁是我試過但沒有用的。 我收到一條錯誤消息,指出“‘UILongPressGestureRecognizer’類型的值沒有成員‘標簽’”。 我正在嘗試為掃雷游戲構建按鈕網格。 謝謝您的幫助。

class ViewController:UIViewController { @IBOutlet var testButtons:[UIButton]! // 這個數組中有 100 個按鈕

override func viewDidLoad() {
    super.viewDidLoad()

    let testButtonPressed = UILongPressGestureRecognizer(target: self, action: #selector(testPressed))
    testButtonPressed.minimumPressDuration = 0.5
    // These indexes are just to test how to recognize which button gets pressed
    testButtons[0].addGestureRecognizer(testButtonPressed)
    testButtons[1].addGestureRecognizer(testButtonPressed)

}

@objc func testPressed(_ sender: UILongPressGestureRecognizer) {
    print("Test button was pressed")

    print(sender.tag) // THIS DOESN'T WORK, BUT CONCEPTUALLY THIS IS WHAT I WANT TO DO
}

出現此錯誤是因為UILongPressGestureRecognizer object 沒有tag屬性

您可以通過以下方式訪問發件人的按鈕:

@objc func testPressed(_ sender: UILongPressGestureRecognizer) {
    guard let button = sender.view as? UIButton else { return }
    print(button.tag)
}

我認為處理按鈕操作的最佳解決方案是添加@IBAction (您可以像@IBOutlet一樣添加它,只需稍作更改 - 設置Action連接類型)

然后在@IBAction塊中,您不能訪問所有按鈕屬性(如tag和其他)

在此處輸入圖像描述

UILongPressGestureRecognizer 是 UIGestureRecognizer 的子類,每個按鈕或視圖只能使用一次。 因為 UILongPressGestureRecognizer 只有一個視圖屬性。 在您的代碼中,它將始終是 testButtons[1] 調用 testPressed 操作。 所以你必須首先像這樣修改 viewDidLoad 代碼:-

for button in testButtons {
        let testButtonPressed = UILongPressGestureRecognizer(target: self, action: #selector(testPressed))
        testButtonPressed.minimumPressDuration = 0.5
        button.addGestureRecognizer(testButtonPressed)
        button.addGestureRecognizer(testButtonPressed)
    }

然后您可以像這樣從 testPressed 訪問按鈕(我希望您已經在情節提要中設置了標簽):-

@objc func testPressed(_ sender: UILongPressGestureRecognizer) {

    if sender.state == .began {
        if let button = sender.view as? UIButton {
            print(button.tag)
        }
    }
}

而不是使用手勢,我認為使用@IBAction 並連接按鈕會更好這里是一個小例子

您需要在按下之前設置標簽! viewDidLoad()方法中,您必須添加如下內容:

testButtons.enumerated().forEach {
     let testButtonPressed = UILongPressGestureRecognizer(target: self, action: #selector(testPressed))
     testButtonPressed.minimumPressDuration = 0.5
     $0.element.addGestureRecognizer(testButtonPressed)
     $0.element.tag = $0.offset
}

當長按接收時,您需要從視圖而不是發件人那里獲取標簽!

print(sender.view?.tag)

由於手勢識別器只應與單個視圖相關聯,並且不直接支持使用標識標簽將其與按鈕匹配。 在為鍵盤創建按鈕數組時,使用單個手勢響應 function,我發現使用手勢識別器“名稱”屬性來識別關聯按鈕更容易。

var allNames: [String] = []

// MARK: Long Press Gesture
func addButtonGestureRecognizer(button: UIButton, name: String) {
    let longPrssRcngr = UILongPressGestureRecognizer.init(target: self, action: #selector(longPressOfButton(gestureRecognizer:)))
    longPrssRcngr.minimumPressDuration    = 0.5
    longPrssRcngr.numberOfTouchesRequired = 1
    longPrssRcngr.allowableMovement       = 10.0
    longPrssRcngr.name = name
    allNames.append(name)
    button.addGestureRecognizer(longPrssRcngr)
}

// MARK: Long Key Press
@objc func longPressOfButton(gestureRecognizer: UILongPressGestureRecognizer) {
    print("\nLong Press Button => \(String(describing: gestureRecognizer.name)) : State = \(gestureRecognizer.state)\n")
    if gestureRecognizer.state == .began || gestureRecognizer.state == .changed {
        if let keyName = gestureRecognizer.name {
            if allNames.contains(keyName) {
                insertKeyText(key: keyName)
            } else {
                print("No action available for key")
            }
        }
    }
}

要實現,請在創建按鈕后調用 addButtonGestureRecognizer function,並為按鈕提供名稱(我使用按鈕文本),例如

addButtonGestureRecognizer(button: keyButton, name: buttonText)

按鈕名稱存儲在“allNames”字符串數組中,以便稍后在“longPressOfButton”中進行匹配。

當按鈕名稱在“longPressOfButton”響應 function 中匹配時,它會將其傳遞給“addKeyFunction”並在那里進行處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM