在UITableViews之间传递NSIndexPath

时间:2012-02-20 18:57:49

标签: iphone ios uitableview nsindexpath

我有UITableView显示plist文件中的数据。对于这个表视图,我只是从plist文件的内容中创建了一个NSArray,并将数据输入到每个单元格中。但是当一个单元被轻敲时,我需要下一个表视图控制器来知道被轻敲的单元的索引路径,以便该视图控制器知道数组中的哪个项显示其详细信息。我尝试过以下方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    staffDetailView = [[StaffDetailViewController alloc] init];
    [staffDetailView setSelectedIndexPath:indexPath];

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

上面,我试图将tapped cell的索引路径传递给我在新视图控制器中创建的NSIndexPath对象。

下一个表视图控制器的头文件:

@interface StaffDetailViewController : UITableViewController {

    NSIndexPath *selectedIndexPath;
    NSArray *staffArray;

}

@property (nonatomic, retain) NSIndexPath *selectedIndexPath;
@property (nonatomic, strong) NSArray *staffArray;

这里我定义了在前一个视图控制器中设置的selectedIndexPath对象。

但是当我尝试访问selectedIndexPath对象以显示相关数据时,该对象似乎是nil

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *header;
    if (section == 0) {
        NSString *name = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Staff Member"];
        NSArray *splitStaffArray = [name componentsSeparatedByString:@", "];
        NSString *lastName = [splitStaffArray objectAtIndex:0];
        NSString *firstName = [splitStaffArray objectAtIndex:1];
        NSString *consolidatedName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
        NSString *assignment = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Assignment"];
        header = [NSString stringWithFormat:@"%@\n%@", consolidatedName, assignment];
        return header;
    }
    return nil;
}

我是否错误地访问了selectedIndexPath对象?是否有一种更好的方法可以将正确的索引路径传递给下一个视图控制器?

2 个答案:

答案 0 :(得分:0)

我修改了第一个表视图控制器的didSelectRowAtIndexPath方法:

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

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [staffDetailView setSelectedIndexPath:indexPath];
    [staffDetailView setPassedName:[[staffArray objectAtIndex:indexPath.row] objectForKey:@"Staff Member"]];   

}

似乎出于某种原因我需要在访问视图控制器的实例变量之前执行segue。奇怪的是,我不能只是alloc init视图控制器本身。无论如何,索引路径现在正在视图控制器之间正确推送。

答案 1 :(得分:-3)

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //I ll use NSUserDefaults to store tha indexpath. Indexpath.row is an int property, so convert to NSNumber 

    NSNumber *ip = [NSNumber numberWithInt:indexpath.row];
    NSUserDefaults *saveIP=[NSUserDefaults standartuserdefaults];
    [saveIP setObject: ip foKey:@"theIndexPath"];

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [staffDetailView setSelectedIndexPath:indexPath];
    [staffDetailView setPassedName:[[staffArray objectAtIndex:indexPath.row] objectForKey:@"Staff Member"]];   

}

我的其他视图控制器使用下面的代码检索保存的对象(数据)

NSNumber *theIndexpath= [[NSUserDefaults standartuserdefaults] objectForKey:@"theIndexPath"];

注意:NSUserDefaults可能不是一个好主意,但它非常简单,仍适用于我的应用程序