Событие UIButton не обрабатывается 1% времени: кого я должен винить в цепочке моих респондентов? - PullRequest
5 голосов
/ 23 февраля 2012

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

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

  • файл XIB, определяющий 3 представления:
    • один просмотр как вид владельца файла
    • 2 дополнительных представления, которые программно добавляются в иерархию представлений
  • В одном из подпредставлений (SubviewA) есть UIButton, настроенный на отправку селектора myAction: на FirstResponder при обнаружении события «Touch Up Inside»
  • SubviewA умеет обращаться myAction:

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

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

  • когда при нажатии кнопки ничего не происходит:
    • моя кнопка определяет причину касания, когда она подсвечивается при нажатии
    • myAction: не вызывается на SubviewA
    • остальная часть интерфейса остается отзывчивой

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

Мои вопросы:

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

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

Ответы [ 2 ]

1 голос
/ 05 марта 2012

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

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

1 голос
/ 23 февраля 2012

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

...