78

我正在尝试建立一种机制来深入了解文件/文件夹列表。这个想法是每次用户选择一个文件夹时显示相同的文件列表视图控制器,如果他/她选择一个文件,则显示一个文件详细视图控制器。

到目前为止,我已经创建了从文件列表视图控制器到文件详细视图控制器的转场,以及从文件列表表视图单元到文件列表表视图控制器的转场:

在此处输入图像描述

这样做的问题是,一旦用户点击单元格,segue 就会被执行。我想从表格视图单元格中删除segue,并从文件列表视图控制器中创建一个到自身。这样,当用户点击单元格时,我可以以编程方式触发正确的 segue。

所以,我的问题是:是否可以在 Interface Builder 中创建从视图控制器到自身的 segue?

4

9 回答 9

43

如果您使用的是导航控制器,则需要将 ViewController 推入导航堆栈。在此示例中,我在 Storyboard ID 设置中将 ViewController 命名为“VDI”。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
[self.navigationController pushViewController:dest animated:YES];

如果您不希望 NavigationController 继续将自己添加到“返回”历史记录中,您可以在添加之前弹出堆栈,就像这样。

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil];
YourVC *dest = [storyboard instantiateViewControllerWithIdentifier:@"VDI"];
UINavigationController *navController = self.navigationController;
[navController popViewControllerAnimated:NO];
[navController pushViewController:dest animated:YES];
于 2013-04-15T21:12:50.193 回答
31

使用 Xcode 5 有一个简单的解决方案。

  1. 单击情节提要中的表格单元格
  2. 打开 Connections Inspector(右上角的右箭头图标)
  3. 在“触发的转场”下,您会看到“选择”
  4. 从“选择”旁边的圆圈拖动到情节提要中的单元格

就是这样。

于 2014-05-02T20:16:55.610 回答
26

我开发了一种使用幻像按钮创建 segue 的方法。我相信它会解决你的问题。你可以在这里阅读我的回答。

于 2012-02-10T15:40:55.810 回答
24

您可以从故事板实例化一个视图控制器(同一个),而不是对同一个控制器执行 segue,然后将其推送到导航控制器上。

于 2012-07-29T04:33:50.213 回答
22

Interface Builder 方法:只需转到引用呈现视图控制器的情节提要参考。

于 2017-07-26T14:29:20.123 回答
17

正确的答案是使用一个故事板参考,它引用了你想要对自身进行 segue 的 UIViewController,然后将 segue 指向它。

在此处输入图像描述

于 2018-01-10T18:35:38.760 回答
12

在 IOS 6 中,有一个比使用幻像按钮更简洁的解决方案。您仍然可以定义从表格单元格到视图控制器的segue,并查看发送者以取消自动触发的segue:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //storyboards should use segues and override prepareForSegue instead
    //but here we need custom logic to determine which segue to use
    id item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    if (item meets condition) {
        [self performSegueWithIdentifier:@"segue1" sender:self];
    } else {
        [self performSegueWithIdentifier:@"segue2" sender:self];
    }
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
    //ignore segue from cell since we we are calling manually in didSelectRowAtIndexPath
    return (sender == self);
}
于 2013-04-27T03:17:57.587 回答
4

以下是如何在不定义 segue 或硬编码其自己的标识符的情况下推送当前视图控制器的另一个实例:

SameViewController *same = [self.storyboard instantiateViewControllerWithIdentifier: self.restorationIdentifier];
[self.navigationController pushViewController: same animated: YES];

您只需将恢复 ID 设置为与 Storyboard ID 相同(在 IB 中有一个复选框)。

恢复 ID

于 2016-07-19T09:23:37.307 回答
0

希望这可以帮助。

我发现你可以创建多个原型单元。

您可以将每个单元格(在情节提要中)链接到不同的视图。

像这样的东西:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
于 2013-09-28T12:55:36.083 回答