在XCode IDE中,MainStoryboard编辑器中视图控制器的底部有两个框:First Responder和Exit。
我知道在代码中以编程方式编写firstResponder是什么,但在storyboard编辑器中,我似乎无法通过它做任何有用的事情。
我是否可以使用此区域的第一个响应者以某种方式设置视图的第一个响应者?我希望第一个文本字段在加载时处于活动状态,我尝试右键单击并拖动无效。我知道我可以在viewDidLoad方法中以编程方式设置它,但有没有办法在这里做到这一点?
绿色退出是什么?
答案 0 :(得分:9)
这个问题没有好的答案,所以我发布了答案:
来自here:
注意:您可能不会非常使用First Responder。这是一个代理对象,它指的是在任何给定时间具有第一响应者状态的任何对象。它也存在于您的笔尖中,您可能从未需要使用它。例如,您可以将Touch Up Inside事件从按钮连接到First Responder的cut:selector。如果在某个时刻文本字段具有输入焦点,则可以按该按钮使文本字段(现在是第一个响应者)将其文本剪切到粘贴板。
编辑:
1)如果您使用带有键盘通知的文本字段,则First Responder非常有用。我使用它来使键盘消失,为你的类的变量currentFirstResponder创建一个插座,并在viewWillDisappear中显示:
[self.currentFirstResponder resignFirstResponder];
2)您可以阅读有关展开细分的信息(“退出”框)here
答案 1 :(得分:8)
我从来没有使用它,可能永远不会,但你可以指定一个对象作为第一个从UI接收事件的对象。
我想你可以创建一个UIView子类并将其添加到UIViewController中,但实际上你想要一些其他对象来接收和处理除你要添加它的UIViewController以外的事件。
答案 2 :(得分:2)
第一响应者:“第一响应者”图标代表用户当前正在与之交互的对象。当用户使用iOS应用程序时,多个对象可能会响应用户创建的各种手势或击键。第一响应者是当前处于控制中并与用户交互的对象。例如,用户输入的文本字段将是第一响应者,直到用户移动到另一个字段或控件为止。
退出:“退出”图标具有非常特定的用途,仅在多场景应用程序中起作用。当您创建一个在一系列屏幕之间移动用户的应用程序时,“退出”图标提供了一种直观的方式来跳回到上一个屏幕。如果您建立了五个相互链接的场景,并且想要从第五个场景快速返回到第一个场景,则可以将第五个场景链接到第一个场景的“退出”图标。
更多here
答案 3 :(得分:0)
您不会经常看到这种情况,实际上删除的答案是正确的,对此的评论(可能影响其删除)是完全错误的!我会尝试并改进它。
通常,要挂接到按钮的IBAction
在包含该按钮的视图控制器中。但是,如果IBAction
在另一个控制器中,例如一个父控制器,然后将其从按钮拖动到“第一响应者”对象,您就可以在父控制器中选择IBAction
!
正如隐藏的答案所述,如何将动作发送到nil来实现,这具有如下效果:在响应者链(即视图层次结构)中搜索动作,如下所示:
[UIApplication.sharedApplication sendAction:@selector(nextObject:) to:nil from:self forEvent:nil];
一个示例是自定义UITableViewCell
。将一个UIButton
添加到该单元格,但您希望该操作转到具有UITableViewController
嵌入序列的View Controller。将修饰而不是操作拖到“第一响应者”,然后在容器视图控制器中选择操作。在查找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
的下载项目,以重新加载它以获取最新数据,然后您的子控制器显示了一些详细信息,但是您还希望它们能够从详细信息中重新加载主要项目,只需在详细信息中添加一个按钮并将其操作拖到“第一响应者”,然后在父控制器中选择重新加载IBAction
。这样,您就可以将按钮挂接到父操作上,而无需使用诸如委托方法之类的其他代码!
要执行此操作,该操作必须位于响应者链层次结构中,否则将无法找到它,您可以阅读文档中链的构建方式。还要注意,如果从代码中调用视图,则必须已经出现视图,viewWillAppear
太早了。