[英]How to pass indexPath.row through the tag property with UILongPressGestureRecognizer in Swift?
[英]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.