故事板从视图控制器到自身

我试图建立一个机制来钻取一个文件/文件夹列表。其思想是在用户每次选择一个文件夹时显示相同的文件列表视图控制器,如果用户选择了一个文件,则显示文件详细信息视图控制器。

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

enter image description here

这样做的问题是,一旦用户点击单元格,就会执行 segue。我想从表格视图单元格中删除接口,然后从文件列表视图控制器中创建一个接口。这样,当用户点击手机时,我就可以通过编程触发正确的切换。

因此,我的问题是: 有没有可能在 Interface Builder 中创建一个从视图控制器到视图本身的接口?

34693 次浏览

我发明了一种方法,用一个幻影按钮创建一个接口。我相信这能解决你的问题。你可以在我的答案 给你中读到。

您可以从情节串连板实例化一个视图控制器(同一个) ,然后将其推送到导航控制器上,而不是执行到同一个控制器的继承。

如果您正在使用导航控制器,则需要将 ViewController 推入导航堆栈中。在这个例子中,我在故事板 ID 设置中将 ViewController 命名为“ VDI”。

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

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

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

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

希望这个能帮上忙。

我发现你可以创建多个原型细胞。

然后您可以将每个单元格(在故事板中)链接到不同的视图。

就像这样:

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

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

  1. 单击故事板中的表单元格
  2. 打开连接检查器(右上角的右箭头图标)
  3. 在“触发序列”下面,你可以看到“选择”
  4. 从“选择”旁边的圆圈中拖动到故事板中的单元格

就是这样。

下面是如何推送当前视图控制器的另一个实例,而不需要定义一个 segue 或者硬编码它自己的标识符:

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

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

Restoration ID

Interface Builder 的方法: 只要继续引用故事板参考,它指的是呈现视图控制器。

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

enter image description here