您不会经常看到这种情况,其中删除的答案实际上是正确的,而对它的评论(可能会影响其删除)是完全错误的!我会努力改进它。
通常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
则为时过早。