Первые ответы iPhone

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

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

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

- (BOOL)canBecomeFirstResponder

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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

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