0

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

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

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

上面,我试图将点击单元格的索引路径传递给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错误地访问了对象?是否有更好的方法将正确的索引路径传递给下一个视图控制器?

4

2 回答 2

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视图控制器本身。无论如何,索引路径现在被正确地推送到视图控制器中。

于 2012-03-13T21:08:54.677 回答
-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 可能不是一个好主意,但它非常简单,并且仍然适用于我的应用程序

于 2012-02-20T21:59:29.303 回答