UIGestureRecognizer в цели / действии InterfaceBuilder

Я устанавливаю приложение UIGestureRecognizer для iPhone. Я делаю это в InterfaceBuilder, перетаскивая распознаватель жестов при длительном нажатии из библиотеки объектов в представление, которое должно принимать жесты.

После того, как я добавляю распознаватель жестов таким образом, у него есть Referencing Outlet Collection, указывающая на представление, которое должно принять этот жест.

Затем в ViewController я добавляю IBOutlet, указывающий на GestureRecognizer

IBOutlet UILongPressGestureRecognizer *gestRec;

и соответствующее действие для распознавателя жестов

-(IBAction)longPress:(id)sender;

После этого Gesture Recognizer показывает в построителе интерфейса выход и действие с именем longPress: с целью с именем ControlManager.

Но моя программа вылетает, когда я делаю долгое нажатие в iPhoneSimulator. Когда я NSlog описание моего GestureRecognizer, он показывает следующий результат:

<UILongPressGestureRecognizer: 0x6859620; 
state = Possible; 
view = <UIView 0x6859e20>; 
target= <(action=longPress:, target=<ControlManager 0x6859af0>)>>

Я думаю, что проблема в последней строке, и она должна выглядеть так:

target=<ControlManager 0x6859af0>; 
action=longPress:

Я делаю что-то неправильно?


person BartoNaz    schedule 28.02.2012    source источник
comment
вы реализуете longPress: в ControlManager? вы можете опубликовать журнал сбоев?   -  person Felix    schedule 28.02.2012
comment
Да. Журнал сбоев выглядит следующим образом: - [__ NSCFString longPress:]: неопознанный селектор отправлен в экземпляр 0x686a8d0   -  person BartoNaz    schedule 28.02.2012
comment
Может быть, вы добавите еще одну цель в код, строку. Это объяснило бы сообщение об ошибке и сбой. Описание распознавателя жестов выглядит нормально. Обратите внимание, что распознаватель жестов может иметь несколько целей / действий.   -  person Felix    schedule 29.02.2012
comment
Я заставил его работать, удалив все представления и контроллер представления и оставив одно представление и один контроллер, и он работает нормально. Итак, теперь мне просто нужно выяснить, что было не так с конкретным представлением и контроллером представления, когда он давал сбой.   -  person BartoNaz    schedule 29.02.2012


Ответы (1)


Вы реализовали распознаватель - (void) longPress: (UIGestureRecognizer) в своем .m? (Я предлагаю обновить идентификатор -> UIGestureRecognizer и отправитель -> распознаватель; IBAction имеет typedef как void, но вы можете сделать это явным)

Вы определенно хотите реализовать селектор, и этот тип сбоя очень распространен, когда метод (если он вообще реализован) не соответствует селектору. Даже отсутствие двоеточия может вызвать несоответствие.

Кроме того, вы настроили отладчик для прерывания работы при возникновении исключения? Если нет, перейдите в отладчик (6-я «вкладка» слева на левой панели), нажмите +, чтобы добавить новую, «Добавить точку останова на исключение» и оставьте значения по умолчанию). Это подтолкнет вас к отладчику, как только возникнет исключение, что обычно является полезным местом в стеке.

Удачи,

Дэмиен

person Damien Del Russo    schedule 28.02.2012
comment
Я исправил, как вы сказали, но все равно не работает. И если я изменю IBAction на void, это действие не будет доступно в InterfaceBuilder, верно? - person BartoNaz; 28.02.2012
comment
И я ошибся. Имя цели в Интерфейсном Разработчике - это не ViewController, а Control Manager, как в описании распознавателя, но это экземпляр UIViewController. - person BartoNaz; 28.02.2012