Для чего нужны поля "Первый ответчик" и "Выход" в редакторе раскадровки?
В среде IDE XCode в нижней части контроллера представления в редакторе MainStoryboard имеются два поля: Первый ответчик и Выход.
Я знаю, что firstResponder программно в коде, но в редакторе раскадровки я не могу сделать что-нибудь полезное с его помощью.
Могу ли я использовать первого респондента в этой области, чтобы каким-то образом установить первого респондента представления? Я хотел бы, чтобы первое текстовое поле было активным при загрузке, и я попытался щелкнуть правой кнопкой мыши и перетащить безрезультатно. Я знаю, что могу установить его программно в методе viewDidLoad, но есть ли здесь какой-нибудь способ сделать это?
А для чего нужен зелёный выход?
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
слишком рано.