Событие UIButton не обрабатывается в 1% случаев: кого мне винить в моей цепочке респондентов?

Мое приложение имеет тенденцию иногда терять информацию о том, какой ответчик должен обрабатывать событие касания.

Моя ситуация:

  • a XIB file defining 3 views:
    • one view as the File's Owner's view
    • 2 дополнительных представления, которые программно добавляются в иерархию представлений.
  • Одно из подпредставлений (SubviewA) имеет UIButton, настроенное на отправку селектора myAction: в FirstResponder при обнаружении события «Touch Up Inside».
  • SubviewA знает, как обращаться с myAction:

В 99% случаев все проходит нормально. Когда пользователь нажимает кнопку, SubviewA обрабатывает сообщение myAction:, и все в порядке. Но время от времени пользователи жалуются на то, что кнопка «зависает», и я фактически воспроизвел это сам пару раз, не имея возможности найти внятный сценарий, чтобы это происходило по требованию.

Мое расследование до сих пор:

  • when nothing happens when tapping the button:
    • my button detects the tap cause it gets highlighted when pressed
    • myAction: не вызывается в SubviewA
    • остальная часть пользовательского интерфейса остается отзывчивой

Код, о котором я говорю, — это устаревший код, который я пытаюсь исправить. Наличие представления, реагирующего на событие для одного из его подпредставлений, кажется мне странной архитектурой. До сих пор я всегда использовал владельца файла, чтобы позаботиться о событиях касания, поэтому я указал, что цепочка респондентов идеально отвечает за ошибку. Но я не могу найти почему! Насколько я понимаю, поскольку кнопка не знает, как обрабатывать сообщение и к ней не подключен контроллер представления, она должна перенаправить его в свой супервизор (ButtonA, который знает, как с ним обращаться)!

Мои вопросы:

  • любая идея о том, откуда может появиться ошибка? (цепочка ответчиков?)
  • какие-либо комментарии о том, должно ли представление обрабатывать поведение своих кнопок самостоятельно или это должен делать контроллер представления?

Редактировать: у меня есть идея, как исправить ошибку: подключить действие кнопки прямо к SubviewA, а не использовать FirstResponder в Interface Builder. Причина, по которой я разместил этот вопрос, состоит в том, чтобы попытаться понять, почему цепочка респондентов время от времени не работает.


person Dirty Henry    schedule 23.02.2012    source источник
comment
Код .m не задействован: только XIB-файлы, которыми не очень легко поделиться.   -  person Dirty Henry    schedule 28.02.2012


Ответы (2)


Можете ли вы просто заставить SubviewA стать FirstResponder, а затем отказаться от него, когда закончите?

person Dan    schedule 23.02.2012
comment
Мой план по исправлению моей ошибки состоит в том, чтобы подключить действие кнопки прямо к SubviewA, а не к FirstResponder в Interface Builder. Я хочу знать, ПОЧЕМУ это не работает с FirstResponder. - person Dirty Henry; 24.02.2012

Когда касания обрабатываются в подпредставлении, они обычно не передаются по цепочке. Так, например, если вы ловите прикосновения в контроллере представления представления содержимого, вы получите прикосновения к UILabel, потому что он их не улавливает. Эти события передаются в представление содержимого, а затем в контроллер. Но вы не увидите никаких касаний UIButton, поскольку этот класс их улавливает (помните, что UIButton интерпретирует ряд последовательностей касаний, а не только касание внутри).

По этой причине вам нужно создать подкласс UIButton, чтобы увидеть касания. Когда вы это сделаете, не забудьте всегда передавать события суперклассу, когда вы закончите с ними, иначе UIButton не будет работать правильно. См. примечания о подклассах в справочнике по классу UIControl. Также взгляните на События управления в этой ссылке., а также некоторые методы экземпляра, чтобы убедиться, что вам действительно нужно уловить штрихи в вашем коде. Обратите внимание, например, что UIButton наследует возможность отслеживать касания от UIControl.

person Kamar Shad    schedule 05.03.2012
comment
ваш ответ имеет смысл, но упускает из виду суть моего вопроса: мой xib-файл явно указывал моей кнопке вызывать myAction для первого ответчика для события Touch-up Inside. Так почему он иногда пропускает это? - person Dirty Henry; 05.03.2012