iOS Storyboard 单元格中的多个 Segue

49

嗨,我有一个故事板并且能够在点击表格单元格时显示详细视图。我想添加额外的功能,这样根据我点击的单元格不同,我可以显示不同的视图控制器。我尝试从同一单元格拖动两个segue,但它不允许这样做。

我的想法是从单元格中拖动两个segue,每个segue指向不同的视图,然后调用所需的segue:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSInteger row = indexPath.row;
    NSLog(@"Selected Item :-) %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:row]]);
    if(row %2 ==0){
        NSLog(@"Even");        
        [self performSegueWithIdentifier:@"ShowSecondIndex" sender:self];
    }else{
        [self performSegueWithIdentifier:@"ShowSelectedMovie" sender:self];
        NSLog(@"Odd");

    }

} 

然后我会在prepareForSegue中处理转场

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    NSLog(@"Prepare For Segue ID:%@",[segue identifier]);

    if([[segue identifier] isEqualToString:@"ShowSelectedMovie"]){
        Tab2_ItemViewController *vc = [segue destinationViewController];
        NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row];
        NSLog(@"Selected Index: %d",selectedIndex);
        [vc setSelectedItem: [NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]];
        NSLog(@"String Value: %@",[NSString stringWithFormat:@"%@",[myData objectAtIndex:selectedIndex]]);
        [vc setSelectedIndex:selectedIndex];


    }else if([[segue identifier] isEqualToString:@"ShowSecondIndex"]){

        NSLog(@"Viewing Second Index");
    }

}

然而,它从未显示第二个视图。这是因为单个表格单元格中不可能有两个segue吗?我还尝试了将两个segue都从控制器拖到每个目标上,而不是一个从单元格中拖出,一个从控制器中拖出,但仍然没有运气?


2
@casperOne - 你为什么关闭了这个问题?如果你不理解这个问题,可以忽略它。这是一个非常常见的问题,许多人都在尝试使用Storyboard。请重新开放。 - Adam
1
完全同意。这肯定是意外关闭了吧?请重新开启。 - Tim
同上。这可能是错误关闭了。 - Jean-Denis Muys
4个回答

69

在这种情况下,不要尝试将Segues连接到tableviewcell,而应将它们连接到视图控制器本身。


1
我尝试了这个,但仍然没有运气,只有一个视图被调用。 - Bear
12
这一定要有效。我经常这样做。现在删除你必须和那个视图控制器相关的 Segue,并将它们添加回去,确保连接每个 Segue 到 VC 本身。然后在 didSelectRowAtIndexPath 中调用 [self performSegueWithIdentifier:@"segueID" sender:nil];。 - LJ Wilson
4
太棒了!我不知道你可以从视图控制器中使用segue,我以为它们只能从按钮或类似的控件中使用。:)现在我有点喜欢使用segue了。 - DonnaLea
1
你能详细阐述一下这个答案吗?它只是一个简单的评论。 - casperOne
1
你是什么意思?我认为除了我已经解释的方式,没有其他方式可以解释了。 - LJ Wilson
显示剩余3条评论

47
不要尝试从TableCell创建多个segue到其他视图控制器,您需要从故事板界面下方的视图控制器图标中ctrl +拖动到要segue到的视图控制器。然后它将允许您设置多个segues。

screenshot showing multiple segues

接下来,为了使转场实际起作用,您需要为转场本身添加标识符,您可以通过单击它们并在属性检查器中给它一个名称来完成:

giving segue an identifier

接下来,以TableCells为例,在您的UITableViewDelegate中,在

-tableView:didSelectRowAtIndexPath: 

你可以使用

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender 

根据您自己的逻辑手动启动segue,以选择应该选择哪个segue。


这是最好的答案,因为使用故事板的接口生成器并不是非常直观。知道你从哪里控制点击是关键 :) - smoothlandon
感谢您在IB中准确地描述了如何做到这一点! - kjw0188

4
这是我演示项目的示例代码:

代码如下:

-         (void)tableView:(UITableView *)tableView
  didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *segueName = nil;

    if (type == kCore) {
        segueName = @"segue1";
    } else if (type == kStdlib) {
        segueName = @"segue2";
    }

    [self performSegueWithIdentifier: segueName sender: self];
}

type是视图控制器的一个属性,它确定应该执行哪个转场。

正如上面的答案所说,关键是通过链接两个视图控制器来创建转场。


1
在Swift 3.1中,使用两种状态的分段控件。
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
var segue: String!
if selectedSegment == 0 {
    segue = "segue1"
} else  {
    segue = "segue2"
}
self.performSegue(withIdentifier: segue, sender: self)

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接