IOS StoryBoard来自表格单元格的多个Segues

时间:2012-01-12 15:49:34

标签: ios storyboard 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中处理segue

- (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从控制器拖到每个目的地而不是一个来自单元格,一个来自控制器但是没有运气???

4 个答案:

答案 0 :(得分:66)

在这种情况下,不要尝试将Segues连接到tableviewcell。将它们连接到View Controller本身。

答案 1 :(得分:45)

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

screenshot showing multiple segues

然后要实际使segue工作,你需要为segues本身添加标识符,你可以点击它们然后在属性检查器中给它一个名字来做:

giving segue an identifier

然后,对于TableCells的示例,在您的UITableViewDelegate中,在

-tableView:didSelectRowAtIndexPath: 

你可以使用

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

根据你自己选择segue的逻辑手动启动一个segue。

答案 2 :(得分: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是视图控制器的属性,它确定应该执行哪个segue。

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

答案 3 :(得分: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)

}