iPhone первые респонденты - PullRequest
10 голосов
/ 10 апреля 2010

Я запутался в цепочке респондента iPhone. В частности, в руководстве по обработке событий iPhone http://developer.apple.com/iPhone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/EventHandling/EventHandling.html, мы имеем следующее:

Первый респондент - это объект респондента в приложении (обычно объект UIView), который назначен первым получателем событий, отличных от событий касания.

Но UIView является подклассом UIResponder. И ссылка на класс UIResponder гласит:

- (BOOL)canBecomeFirstResponder

Возвращаемое значение

ДА, если получатель может стать первым респондентом, в противном случае НЕТ. Обсуждение

По умолчанию возвращает NO. Если объект респондента возвращает ДА ​​из этого метода, он становится первым респондентом и может получать сенсорные события и сообщения действий. Подклассы должны переопределить этот метод, чтобы иметь возможность стать первым респондентом.

Я смущен очевидным противоречием. Кто-нибудь может прояснить это для меня?

Для чего бы то ни было, я настроил простое приложение на основе представления и вызвал canBecomeFirstResponder и isFirstResponder для его представления. Оба вернули НЕТ.

Ответы [ 2 ]

16 голосов
/ 10 апреля 2010

Номенклатура может сбивать с толку. Вместо «первого респондента» воспринимайте его как «начальную цель события», то есть объект, который является первым респондентом, становится начальной целью для всех событий. В некоторых API это также называется «фокусом», хотя в API Apple это обычно зарезервировано для описания окон.

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

То, будет ли определенный класс наследовать от NSResonder, не имеет никакого отношения к тому, позволит ли класс (или конкретный экземпляр класса) самому себе быть установлен в качестве первого-ответчика / первоначального события-цели. Эта способность исходит исключительно из ответа экземпляров на сообщение canBecomeFirstResponder. Один и тот же экземпляр может отказаться быть первым-респондентом / первичным-целевым событием при одном наборе условий, а затем разрешить его позднее, когда условия изменятся. Классы могут, конечно, получить статус, если захотят.

Другими словами, первый-респондент / начальное-событие-цель - это состояние определенного экземпляра в определенное время. Первый-респондент / intial-event-target похож на «горячий картофель» или токен, который передается от экземпляра к экземпляру в пользовательском интерфейсе. Некоторые классы вообще отказываются брать горячий картофель. Некоторые всегда так делают, а другие хватают это иногда и игнорируют.

9 голосов
/ 10 апреля 2010

Это означает, что базовый UIView не может стать первым респондентом - он ничего не делает с событиями движения, сообщениями меню редактирования и т. Д.

Некоторые подклассы UIView (например, UITextView) могут стать первым респондентом, и вы можете написать свой собственный подкласс UIView, который тоже делает это.

...