【问题标题】:IOS StoryBoard multiple Segue's from a TableCellIOS StoryBoard 来自 TableCell 的多个 Segue
【发布时间】:2012-02-08 21:52:02
【问题描述】:

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

}

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

【问题讨论】:

  • @casperOne - 你为什么关闭它?如果你不明白这个问题,请忽略它。对于尝试使用 Storyboard 的人来说,这是一个非常常见的问题。请取消关闭。
  • 完全同意。这肯定是不小心关闭的?请打开。
  • 同上。这可能被错误地关闭了。

标签: ios storyboard segue


【解决方案1】:

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

【讨论】:

  • 我试过了,但还是不行,只调用了一个视图
  • 这必须工作。我一直这样做。现在删除该 VC 的 Segue 并将它们添加回来,确保将每个 segue 连接到 VC 本身。然后你可以调用 [self performSegueWithIdentifier:@"segueID" sender:nil];在 didSelectRowAtIndexPath 上。
  • 甜蜜!我不知道你可以从视图控制器中获得 segue,我认为它们只能像按钮或类似的那样去。 :) 我现在更喜欢 segues 了。
  • 你能充实一下这个答案吗?这只不过是一条评论。
  • 你是什么意思?除了我的做法,我认为没有其他方法可以解释它。
【解决方案2】:

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

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

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

-tableView:didSelectRowAtIndexPath: 

你可以使用

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

根据你自己的逻辑来手动启动一个 segue 应该选择什么。

【讨论】:

  • 这是最好的答案,因为带有 Storyboards 的界面生成器不是超级直观。知道您控制点击的位置是关键:)
  • 感谢您准确描述如何在 IB 中执行此操作!
【解决方案3】:

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

-         (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。

【讨论】:

    【解决方案4】:

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

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      相关资源
      最近更新 更多