Для чего нужны поля "Первый ответчик" и "Выход" в редакторе раскадровки?

В среде IDE XCode в нижней части контроллера представления в редакторе MainStoryboard имеются два поля: Первый ответчик и Выход.

Я знаю, что firstResponder программно в коде, но в редакторе раскадровки я не могу сделать что-нибудь полезное с его помощью.

Могу ли я использовать первого респондента в этой области, чтобы каким-то образом установить первого респондента представления? Я хотел бы, чтобы первое текстовое поле было активным при загрузке, и я попытался щелкнуть правой кнопкой мыши и перетащить безрезультатно. Я знаю, что могу установить его программно в методе viewDidLoad, но есть ли здесь какой-нибудь способ сделать это?

А для чего нужен зелёный выход?

First Responder (оранжевый) и Exit (зеленый) - для чего они

3 ответа

Решение

Я никогда не использовал его и, вероятно, никогда не буду, но вы можете назначить объект первым в очереди, чтобы получать события из пользовательского интерфейса.

Я полагаю, вы могли бы создать подкласс UIView и добавить его в UIViewController, но вы на самом деле хотите, чтобы какой-то другой объект получал и обрабатывал события, отличные от UIViewController, к которому вы добавляете его.

На этот вопрос нет хорошего ответа, поэтому я публикую свой ответ:

Отсюда:

Примечание. Вероятно, вы не будете часто использовать First Responder. Это прокси-объект, который ссылается на любой объект, имеющий статус первого респондента в любой момент времени. Он также присутствовал в ваших перьях, и вам, вероятно, никогда не приходилось его использовать. Например, вы можете подключить событие Touch Up Inside от кнопки к селектору "Первый ответчик": Если в какой-то момент текстовое поле имеет фокус ввода, вы можете нажать эту кнопку, чтобы текстовое поле, которое теперь является первым респондентом, вырезало его текст на монтажном столе.

Редактировать:

1) First Responder очень полезен, если вы используете текстовые поля с клавиатурными уведомлениями. Я использую его, чтобы заставить клавиатуру исчезнуть, создать выход для переменной currentFirstResponder вашего класса и в viewWillDisappear:

[self.currentFirstResponder resignFirstResponder];

2) Вы можете прочитать о размотке сега (поле "Выход") здесь

Первый ответчик. Значок "Первый ответчик" обозначает объект, с которым в данный момент взаимодействует пользователь. Когда пользователь работает с приложением iOS, несколько объектов могут потенциально реагировать на различные жесты или нажатия клавиш, которые создает пользователь. Первым респондентом является объект, который в данный момент находится под контролем и взаимодействует с пользователем. Например, текстовое поле, которое вводит пользователь, будет первым респондентом, пока пользователь не перейдет в другое поле или элемент управления.

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

Больше здесь

Вы не часто видите это, когда удаленный ответ на самом деле правильный, а комментарий к нему (вероятно, влияющий на его удаление) совершенно неправильный! Я постараюсь улучшить его.

Обычно IBActionвы хотите подключиться к кнопке, находится в контроллере представления, содержащем кнопку. Однако еслиIBAction находится в другом контроллере, например, в родительском контроллере, затем перетащите его от кнопки к объекту First Responder, и вы сможете выбрать IBAction в родительском контроллере!

Как указано в скрытом ответе, это реализовано так: действие отправляется в nil, что приводит к тому, что цепочка респондентов (то есть иерархия представлений) ищет действие, следующим образом:

[UIApplication.sharedApplication sendAction:@selector(nextObject:) to:nil from:self forEvent:nil];

Пример - обычай UITableViewCell. ДобавитьUIButton в ячейку, но вы хотите, чтобы действие перешло к контроллеру представления, у которого есть переход к UITableViewController. Перетащите действие ретуши вверх в First Responder и выберите действие в контроллере представления контейнера. В действии, чтобы найти indexPath, просто зациклируйте visibleCells и проверьте, является ли отправительisDescendantOfView:

- (IBAction)cellButtonTapped:(id)sender{
    for(UITableViewCell *cell in self.tableViewController.tableView.visibleCells){
        if([sender isDescendantOfView:cell]){
            NSIndexPath *indexPath = [self.tableViewController.tableView indexPathForCell:cell];
            NSLog(@"tapped %@", indexPath);
        }
    }
}

Другим примером может быть кнопка перезагрузки: скажем, ваш первый контроллер представления показывает загруженный элемент с IBAction чтобы перезагрузить его для получения последних данных, тогда ваш дочерний контроллер покажет некоторые детали, но вы также хотите, чтобы они могли перезагружать основной элемент из детали, просто добавьте кнопку в детали и перетащите ее действие в First Responder и выберите перезагрузку IBActionв родительском контроллере. Это позволяет вам подключать кнопки к родительским действиям без дополнительного кода, такого как методы делегата!

Чтобы это работало, действие должно находиться в иерархии цепочки респондентов, иначе оно не будет найдено, вы можете прочитать, как построена цепочка, в документации. Также обратите внимание, что при вызове из кода должно появиться представление,viewWillAppear слишком рано.

Другие вопросы по тегам