31

在 XCode IDE 中,MainStoryboard 编辑器的视图控制器底部有两个框:First Responder 和 Exit。

我知道 firstResponder 在代码中以编程方式是什么,但是在故事板编辑器中,我似乎无法做任何有用的事情。

我是否能够使用该区域的第一响应者以某种方式设置视图的第一响应者?我希望第一个文本字段在加载时处于活动状态,我尝试右键单击并拖动无济于事。我知道我可以在 viewDidLoad 方法中以编程方式设置它,但是这里有什么方法吗?

绿色出口有什么用?

急救人员(橙色)和出口(绿色)——它们的用途是什么?

4

4 回答 4

9

这个问题没有好的答案,所以我发布我的答案:

这里

注意:您可能不会经常使用 First Responder。这是一个代理对象,它引用在任何给定时间具有第一响应者状态的任何对象。它也存在于您的笔尖中,您可能也从未需要使用它。例如,您可以将 Touch Up Inside 事件从按钮连接到 First Responder 的 cut: 选择器。如果在某个时候文本字段具有输入焦点,那么您可以按下该按钮以使文本字段(现在是第一响应者)将其文本剪切到粘贴板上。

编辑:

1) 如果您使用带有键盘通知的文本字段,First Responder 非常有用。我用它来使键盘消失,为您班级的变量 currentFirstResponder 提供一个出口,并在 viewWillDisappear 中:

[self.currentFirstResponder resignFirstResponder];

2) 您可以在此处阅读有关 unwind segues(“退出”框)的信息

于 2014-10-25T19:55:14.477 回答
8

我从未使用过它,而且可能永远不会使用它,但您可以将一个对象指定为第一个从 UI 接收事件的对象。

我想您可能正在创建一个 UIView 子类并将其添加到 UIViewController 但您实际上希望其他对象接收和处理您添加到的 UIViewController 以外的事件。

我发现这个链接可以更好地解释它。

于 2012-11-26T12:52:23.943 回答
3

第一响应者:第一响应者图标代表用户当前正在与之交互的对象。当用户使用 iOS 应用程序时,多个对象可能会响应用户创建的各种手势或击键。第一响应者是当前控制并与用户交互的对象。例如,用户正在输入的文本字段将是第一响应者,直到用户移动到另一个字段或控件。

退出:退出图标具有非常特殊的用途,仅在多场景应用程序中发挥作用。当您创建一个在一系列屏幕之间移动用户的应用程序时,退出图标提供了一种跳回前一个屏幕的视觉方式。如果您已经构建了五个相互链接的场景,并且您想从第五个场景快速返回到第一个场景,您将从第五个场景链接到第一个场景的退出图标。

更多在这里

于 2018-07-17T17:19:18.573 回答
1

您不会经常看到这种情况,其中删除的答案实际上是正确的,而对它的评论(可能会影响其删除)是完全错误的!我会努力改进它。

通常IBAction你想连接到一个按钮是在包含按钮的视图控制器中。但是,如果IBAction在不同的控制器中,例如父控制器,然后从按钮拖动到 First Responder 对象,您就可以IBAction在父控制器中选择 !

正如隐藏的答案所述,这是如何实现的是将动作发送到 nil,这具有在响应者链(即视图层次结构)中搜索动作的效果,如下所示:

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

一个例子是自定义UITableViewCell. 将 a 添加UIButton到单元格,但您希望该操作上升到具有嵌入 segue 到 a 的视图控制器UITableViewController。将 touch up instead 动作拖到 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则为时过早。

于 2019-12-04T12:09:50.377 回答