【问题标题】:iOS 5 - Segue from one TableViewController to another TableViewControlleriOS 5 - 从一个 TableViewController 转移到另一个 TableViewController
【发布时间】:2012-08-10 03:16:56
【问题描述】:

我正在尝试从一个 TableViewController 中选择一个详细信息披露按钮(或一行)并转到另一个 TableViewController,而不将任何数据从第一个 TableViewController 传递到第二个 TableViewController。因此,第一个 TableViewController 几乎充当了一个表格,它将根据所选的详细信息披露按钮(或行)导航到不同的 TableViewControllers。

到目前为止,我的代码如下所示:

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


    NSUInteger rowNumber = [indexPath row];   
    NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];

    self.categoryData = [self.commuterDict objectForKey:categoryCode];

    [self performSegueWithIdentifier:@"ShowPlaces" sender:self];
}

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

    if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {

        PlacesViewController *placesViewController = [segue destinationViewController];

        // --> I believe I'm missing something here to access a specific row? <--



    }
}

希望有人能帮帮我!

【问题讨论】:

    标签: ios uitableview segue


    【解决方案1】:

    您从 tableView:accessoryButtonTappedForRowWithIndexPath: 函数中的 indexPath 获取特定行。具体来说,被点击的行是 indexPath.row。 (如果您的表格有多个部分,那么您也可以从 indexPath 中读取该部分,但听起来您只是在使用一个简单的表格。)

    您可以将当前行存储在一个变量中,然后在 prepareForSegue:sender 中读取它以选择去哪里。

    【讨论】:

      【解决方案2】:

      UIViewController 的-prepareForSegue:sender: 的文档说:

      因为可以从多个来源触发 segue,所以您可以使用 segue 和 sender 参数中定义上下文的信息 用于segue并传递适当的信息。例如,如果 segue 源自一个表视图,sender 参数将 识别用户点击的表格视图单元格。你可以用那个 在目标视图控制器上设置数据的信息。

      鉴于此,我将首先查看sender 参数并期望它是指向表格单元格的指针。如果您知道单元格应该在哪个表中,您可以使用-indexPathForCell: 来检索单元格的索引路径。

      【讨论】:

      • 在这种情况下,您不能只将索引路径作为发件人传递吗?
      • 这是正确的做法。将当前行存储在 accessoryButtonTapped 方法中可能有效,但它正在自找麻烦
      【解决方案3】:

      您可以将 segue 从视图控制器拖到您想要在按下详细信息披露按钮时显示的视图。您可以从代码中触发 segue,如下所示

      -(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
      {
          [self performSegueWithIdentifier:@"UpdateData" sender:self];
      }
      

      来自奥地利的欢呼 马丁

      【讨论】:

        【解决方案4】:

        如果你的 sender 对象是一个 tableviewcell,下面的代码 sn-p 应该可以工作:

        NSIndexPath *indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender];
        

        否则试试

        NSIndexPath *indexPath = nil;
        if ([sender isMemberOfClass:[UITableViewCell class]]) 
        {
            indexPath = [[[segue sourceViewController] tableView] indexPathForCell:sender]; 
        }
        else if ([[sender superview] isMemberOfClass:[UITableViewCell class]])
        {
            indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[sender superview]];
        }
        else if ([[[sender superview] superview] isMemberOfClass:[UITableViewCell class]])
        {
            indexPath = [[[segue sourceViewController] tableView] indexPathForCell:(UITableViewCell *)[[sender superview] superview]];
        }
        

        【讨论】:

          【解决方案5】:

          您在准备转场时使用的发件人可以是您想要的任何人。如果你想知道行,发送行,或者索引路径:

          - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
          
          
              NSUInteger rowNumber = [indexPath row];   
              NSString *categoryCode = [self.categoryCodes objectAtIndex:rowNumber];
          
              self.categoryData = [self.commuterDict objectForKey:categoryCode];
          
              [self performSegueWithIdentifier:@"ShowPlaces" sender:indexPath];
          }
          
          - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
          
              if ([[segue identifier] isEqualToString:@"ShowPlaces"]) {
          
                  PlacesViewController *placesViewController = [segue destinationViewController];
          
                  // Row information is supplied as the sender
                  NSIndexPath *indexPath = sender;
          
          
              }
          }
          

          如果要使用实际行,则将其设为发件人

          [self performSegueWithIdentifier:@"ShowPlaces" sender:[tableView cellForRowAtIndexPath:indexPath]];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-16
            相关资源
            最近更新 更多