从视图控制器到自身的情节提要Segue


76

我正在尝试建立一种机制来向下钻取文件/文件夹列表。想法是每次用户选择一个文件夹时都显示相同的文件列表视图控制器,并且如果他/她选择了一个文件,则显示文件详细信息视图控制器。

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

在此处输入图片说明

问题在于,一旦用户点击单元格,就会执行segue。我想从表视图单元格中删除序号,并从文件列表视图控制器中将其自身设置为一个。这样,当用户点击单元格时,我可以通过编程方式触发正确的选择。

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


1
是的,您可以使用xcode 5。见帖子
约翰·亨克尔

打开“编辑器”菜单,单击Show Document Outline,然后右键单击该单元格到“大纲”的“文件列表”ViewController对象。
DawnSong

Answers:


26

我开发了一种使用幻像按钮创建序列的方法。我相信它将解决您的问题。您可以在这里的我的回答中阅读有关内容。


4
这使我走上了正确的轨道。我在“ Dock”上添加了一个按钮,并将其连接到文件列表视图控制器。现在,我可以根据需要以编程方式执行segue。谢谢!
豪尔赫2012年

1
我希望这不是为了进行自检而必须的方法,但这是可行的。
jogloran 2012年

2
Mustafa的解决方案不那么笨拙,而且非常简单。使用幻像按钮对相同的视图进行选择只会使情节提要混乱。
strada 2013年

43

如果您使用的是导航控制器,则需要将ViewController推入导航堆栈。在此示例中,我在情节提要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];

此方法和@ TJ / @ Jorge方法都将起作用。我选择这种方式是因为它感觉更干净。我可以用另一种方法看到的好处是,您可以在情节提要中看到循环的主题,并且可以在“ prepareForSegue:”中处理所有导航操作
siburb 2013年

1
工作完美!同样,对于那些希望重新创建它的人来说,这就是他在XCode中设置为“ VDI”的“ Storyboard ID”。
Nerrolken

31

使用Xcode的5还有很多简单的解决方案。

  1. 单击情节提要中的表格单元格
  2. 打开连接检查器(右上角的右箭头图标)
  3. 在“触发的序列”下,您会看到“选择”
  4. 从“选择”旁边的圆圈拖到情节提要中的单元格

而已。


2
这种方法就像没有代码的魅力一样。
John Smith

2
这是xcode 5+正确答案,现在,您应该为此使用“显示”提示。
CupawnTae 2015年

2
似乎不适用于我,视图控制器也不会变为“蓝色”以允许添加序列。
db0

24

您可以从情节提要中实例化视图控制器(相同的视图),然后将其推到导航控制器上,而不是对同一控制器执行segue操作。


我更喜欢幻像按钮解决方案,我所有的向前转换都通过prepareForSegue进行:而不是记住是否是用IB或代码创建了转​​换。
史蒂夫·摩泽尔

19

界面生成器方法:只需找到情节提要参考即可,该参考指回当前的视图控制器。


2
如果在IB中使用segue完成其他导航,则这种方法是最好的!谢谢!
罗兰T.17年

绝对应该被接受,因为现在有故事板参考(当问问题时情况并非如此)
Christophe Blin

我发现这是最优雅的解决方案,因为它已经可用
ZShock

4
额外的细节:您需要为控制器提供一个Storyboard ID,然后在参考的“ Referenced ID”字段中使用该ID 。
约翰·卡米列里

17

正确的答案是使用一个Storyboard引用,该引用引用您要为其本身选择的UIViewController,然后将其指向该对象。

在此处输入图片说明


12

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

- (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);
}

4

您可以通过以下方法来推送当前视图控制器的另一个实例,而无需定义segue或对其自身的标识符进行硬编码:

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

您只需要将还原ID设置为与情节提要ID相同(IB中有一个复选框)。

恢复ID


0

希望这可以帮助。

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

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

像这样:

NSString *CellIdentifier = @"Cell"; 
if (Condition2 ){
CellIdentifier = @"Cell2"; } 
if (Condition3 ){
CellIdentifier = @"Cell3"; }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.