iOS 5 - 从一个TableViewController调用另一个TableViewController

时间:2011-12-10 06:39:27

标签: ios uitableview segue

我正在尝试从一个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? <--



    }
}

我希望有人可以帮助我!

5 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

UIViewController的-prepareForSegue:sender:文档说:

  

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

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

答案 2 :(得分:0)

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

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

来自奥地利的欢呼声 马丁

答案 3 :(得分:0)

如果您的发件人对象是tableviewcell,则以下代码段应该有效:

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]];
}

答案 4 :(得分:0)

您用于准备segue的发件人可以是您想要的任何内容。如果您想知道该行,请发送行或索引路径:

- (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]];