故事板从视图控制器到它本身

问题描述:

我想制作一个机制来深入查看文件/文件夹列表。这个想法是每次用户选择一个文件夹时显示相同的文件列表视图控制器,并显示文件详细视图控制器,如果他/她选择一个文件。故事板从视图控制器到它本身

到目前为止,我已经创建从文件列表视图控制器,该文件详细视图控制器SEGUE,并从文件目录表视图单元格的文件列表表视图控制器赛格瑞:

enter image description here

问题在于,只要用户点击单元格,segue就会被执行。我想从表视图单元格中删除segue,并从文件列表视图控制器中将其自行创建。这样,我可以在用户点击单元格时以编程方式触发正确的继续。

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

+1

是的,使用xcode 5你可以。 [见后](http://*.com/questions/9226983/storyboard-segue-from-view-controller-to-itself/23436265#23436265)。 – 2014-05-02 20:20:42

+0

打开编辑器菜单,单击'显示文档轮廓',然后只需将鼠标右键拖动到轮廓的文件列表''ViewController''对象。 – 2017-08-21 06:54:03

我开发了一个方法来使用幻影按钮创建一个segue。我相信它会解决你的问题。你可以在我的回答here中阅读。

+4

这使我走上正轨。我在“Dock”上添加了一个按钮,并将它连接到文件列表视图控制器。现在我可以按照我想要的方式编程。谢谢! – Jorge 2012-02-10 23:50:39

+1

我希望这不是仅仅为了得到一个自我延续,但这是有效的。 – jogloran 2012-07-22 14:16:06

+2

穆斯塔法的解决方案不太简单,而且非常简单。用幻影按钮制作相同的视图只会让你的故事板变得混乱。 – strada 2013-04-09 15:50:44

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

+0

我更喜欢幻影按钮解决方案,所有的转发都通过prepareForSegue:而不是记住是否在IB或代码中创建了转换。 – 2015-07-10 01:29:42

如果您使用的是导航控制器,则需要将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]; 
+0

这一个和@ TJ/@ Jorge方法都可以工作。我已经走了这条路,因为它感觉更干净。 我可以在另一种方法中看到的好处是,您可以在故事板中看到循环赛段,并且您可以在“prepareForSegue:”中处理所有导航。 – siburb 2013-12-17 08:10:48

+1

完美工作!此外,这是XCode中的“Storyboard ID”,他将其设置为“VDI”,以便那些希望重新创建这些内容的人使用。 – Nerrolken 2014-08-21 04:01:21

在IOS 6,有a cleaner solution比使用幻象按钮。您还可以定义从表格单元格视图控制器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); 
} 

希望这有助于。

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

比你可以链接每个单元格(在故事板)到不同的视图。

事情是这样的:

NSString *CellIdentifier = @"Cell"; 
if (Condition2){ 
CellIdentifier = @"Cell2"; } 
if (Condition3){ 
CellIdentifier = @"Cell3"; } 

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

  1. 单击表格单元格中的故事板
  2. 打开连接督察(右上角右箭头图标)
  3. 在“触发塞格斯”看到“选择”从圆
  4. 将在下到“选择”到故事板中的单元格

就是这样。

+2

这种方法就像没有任何代码的魅力一样。 – 2014-06-02 07:36:24

+2

这是xcode 5+的*正确答案,现在您应该使用“show”segue。 – CupawnTae 2015-11-26 13:56:33

+2

似乎没有为我工作,视图控制器不会成为“蓝色”,以允许添加赛格。 – db0 2016-06-07 04:00:52

这里是你如何能推动当前视图控制器的另一实例,而不定义赛格瑞或硬编码它自己的标识:

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

你只需要设置恢复ID是相同的故事板ID(有IB中的复选框)。

Restoration ID

界面生成器的方法:只要原因请看其指回所述呈现视图控制器故事板参考。

+1

如果使用IB中的segues完成其他导航,此方法是最好的!谢谢! – 2017-10-17 00:47:27

正确的答案是使用一个故事板参考引用您想要继续自己的UIViewController,然后将segue指向它。

enter image description here