2017-02-12 3 views
0

У меня есть 20 + кнопок, и я хочу определить единый UILongPressGestureRecognizer для всех, возможно ли это?Как определить единый UILongPressGestureRecognizer для всех кнопок? В swift 3

До сих пор это не работает:

let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture)) 

B_BTN_1.addGestureRecognizer(longPressGestureRecognizer) 
B_BTN_2.addGestureRecognizer(longPressGestureRecognizer) 

По какой-то причине, longPressGestureRecognizer работает только для "B_BTN_2".

Но, объявив жест распознаватель для каждого, это работает:

let longPressGestureRecognizer1 = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture)) 
let longPressGestureRecognizer2 = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture)) 

B_BTN_1.addGestureRecognizer(longPressGestureRecognizer1) 
B_BTN_2.addGestureRecognizer(longPressGestureRecognizer2) 

EDIT:

Если вы собираетесь использовать @ решение Андре, и имеет много кнопок, использовать это вместо того, чтобы предотвратить индексирование ошибка (занимает, как навсегда):

var buttons:[UIButton] = [] 
    buttons.append(B_BTN_1) 
    buttons.append(B_BTN_2) 
    buttons.append(B_BTN_3) 
    ..... 
+0

Всегда вам нужно создать новую ссылочную переменную типа UILongPressGestureRecognizer и присвоить ее представлениям. –

ответ

1

как @Andriy Savran уже заявил, что распознаватель жеста может иметь только вид прилагается. вы можете использовать циклы, чтобы упростить процесс настройки ...

override func viewDidLoad() { 
    super.viewDidLoad() 

    let button1 = UIButton(type: .system) 
    let button2 = UIButton(type: .system) 
    let button3 = UIButton(type: .system) 
    // ... 

    let buttons = [button1, button2, button3] 

    for button in buttons { 
     let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(sender:))) 
     button.addGestureRecognizer(longPressGestureRecognizer) 
    } 

} 

func handleLongPress(sender: UILongPressGestureRecognizer) { 
    guard let button = sender.view else { 
     fatalError("could not get the button attached to the gesturerecognizer") 
    } 

    // do something 
} 
+0

Ах! Тот, который мне нужен! Спасибо – iOSNewbie

+0

приветствую :) –

1

Цитата от Apple, док:

Каждый распознаватель жестов связан с одним видом. В отличие от этого, представление может иметь несколько распознавателей жестов, поскольку одно представление может реагировать на множество разных жестов. Чтобы распознаватель жестов распознавал штрихи, которые происходят в определенном виде, вы должны прикрепить распознаватель жестов к этому представлению. Когда пользователь прикасается к этому представлению, распознаватель жеста получает сообщение о том, что перед объектом представления произошло касание. В результате распознаватель жеста может откликаться на прикосновения от имени представления.

https://developer.apple.com/library/content/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html#//apple_ref/doc/uid/TP40009541-CH2-SW21

Таким образом, вы должны инициализировать жест распознаватель для каждого вида, как вы делали это:

Но, объявив жест распознаватель для каждого, это работает:

let longPressGestureRecognizer1 = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture)) 
let longPressGestureRecognizer2 = UILongPressGestureRecognizer(target: self, action: #selector(handleLongGesture)) 

B_BTN_1.addGestureRecognizer(longPressGestureRecognizer1) 
B_BTN_2.addGestureRecognizer(longPressGestureRecognizer2) 
+0

Я вижу! Спасибо за указание на это. Я думал, что смогу создать розетку для кнопок, а затем присоединить один UILongPressGestureRecognizer. Это просто боль в глазах, чтобы увидеть повторяющиеся строки кода только для одного и того же объявления распознавателя жестов. – iOSNewbie

+0

@ iOSNewbie: взгляните на мое решение - он содержит способ обойти повторяющийся код ... :) –

Смежные вопросы