49

嗨,我有一个情节提要,并且能够在单击表格单元格时显示详细视图。我想添加额外的功能,以便根据我单击的单元格显示不同的视图控制器。我尝试从同一个单元格中拖动两个 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");
    }

}

但是它从不显示第二个视图。这是因为不可能从一个表格单元格中获得两个 segues。我还尝试将两个segue从控制器拖到每个目的地,而不是一个从单元格和一个从控制器,但还是没有运气???

4

4 回答 4

69

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

于 2012-01-12T16:18:22.433 回答
47

不要尝试创建从 TableCell 到其他视图控制器的多个 segue,您希望从情节提要界面中视图控制器下方的视图控制器图标 ctrl+拖动到要继续的视图控制器。然后它将允许您设置多个转场。

显示多个 segue 的屏幕截图

然后要真正使 segues 工作,您需要向 segues 本身添加标识符,您可以通过单击它们然后在属性检查器中为其命名来做到这一点:

给 segue 一个标识符

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

-tableView:didSelectRowAtIndexPath: 

您可以使用

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

根据您自己应该选择什么segue的逻辑手动启动segue。

于 2012-07-25T04:50:52.990 回答
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。

于 2013-09-13T00:12:02.090 回答
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)

}

于 2017-05-18T07:26:27.063 回答