Согласно документации от Apple:

Когда ваше приложение получает событие, UIKit автоматически направляет это событие наиболее подходящему объекту-ответчику, известному как первый респондент.

В той же документации объясняется, как определяется первый респондент :

HitTest: withEvent: метод UIView просматривает иерархию представлений в поисках самого глубокого подпредставления, содержащего указанное касание, которое становится первым ответчиком на событие касания.

Я не понимаю, почему существует свойство UIResponder под названием isFirstResponder? И почему существует becomeFirstResponder. Разве первый респондент не должен определяться UIKit динамически на основе местоположения конкретного события касания?

Кроме того, canBecomeFirstResponder возвращает NO для UIView, что явно неверно, поскольку представления действительно обрабатывают события касания.

Единственный способ, которым я могу решить эту путаницу, - это если все эти методы относятся только к событиям типа встряхивания, удаленного управления и меню редактирования. Но в документации об этом не говорится.

-1
Artium 6 Окт 2021 в 09:55

2 ответа

Лучший ответ

Я не понимаю, почему существует свойство UIResponder под названием firstResponder?

Нет. UIResponder не имеет общедоступного свойства с именем firstResponder.

И почему существует becomeFirstResponder.

Основное использование becomeFirstResponder - программный выбор текстового поля для получения событий клавиатуры.

Разве первый респондент не должен определяться UIKit динамически на основе местоположения конкретного события касания?

Событий больше, чем событий прикосновения. Например, есть события клавиатуры и события движения. Первый респондент, отслеживаемый UIKit, предназначен для событий без касания. В других системах эта концепция обычно называется «фокус» или, более конкретно, «фокус клавиатуры». Но (в iOS) первым респондентом может быть представление, которое не реагирует на события клавиатуры.

Кроме того, canBecomeFirstResponder возвращает NO для UIView, что явно неверно, поскольку представления действительно обрабатывают события касания.

Это нормально, потому что события касания на самом деле не запускаются первым респондентом. Они начинаются с представления, возвращенного -[UIView hitTest:withEvent:].

Единственный способ, которым я могу решить эту путаницу, - это если все эти методы относятся только к событиям типа встряхивания, удаленного управления и меню редактирования. Но в документации об этом не говорится.

Есть и другие виды событий без касания, которые начинаются с первого респондента, но, помимо этого, вы разрешили его правильно.

2
rob mayoff 6 Окт 2021 в 13:27

Это не тема для «быстрого ответа» - лучше всего поискать и прочитать несколько статей об этом.

Но вкратце ...

.becomeFirstResponder() часто используется для активации текстовых полей, не требуя от пользователя нажатия на поле. Обычный случай - с несколькими текстовыми полями (заполните тип интерфейса формы), где вы автоматически "переходите" к следующему полю на основе ввода:

myTextField.becomeFirstResponder()

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

-1
DonMag 6 Окт 2021 в 12:36