【问题标题】:Pass NSIndexPath between UITableViews在 UITableViews 之间传递 NSIndexPath
【发布时间】:2012-03-14 05:08:54
【问题描述】:

我有一个 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];
}

上面,我试图将点击单元格的索引路径传递给我在新视图控制器中创建的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 对象?有没有更好的方法将正确的索引路径传递给下一个视图控制器?

【问题讨论】:

  • 为什么不简单地转发对象实例而不是它的indexPath?
  • 我有多个要显示的对象实例,我认为为了效率,最好只传递索引路径并让下一个视图控制器负责检索数据。不过,我会再次尝试这种方法。
  • 采用这种方法返回 null。
  • 那你就做错了 - 在问题中向我们展示你的替代代码,作为解决问题的额外尝试。
  • 按照 'Till' 的建议去做。将索引路径处的对象传递给子视图控制器。从数组的另一个实例重新获取是不必要的开销。只是传递你需要的东西。

标签: iphone ios uitableview nsindexpath


【解决方案1】:

我修改了第一个table view controller的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 视图控制器本身。无论如何,索引路径现在被正确地推送到视图控制器中。

【讨论】:

    【解决方案2】:
    - (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 可能不是一个好主意,但它非常简单,并且仍然适用于我的应用程序

    【讨论】:

    • 这是糟糕的代码。 NSUserDefaults 只能用于设置,不能用于任意数据。此外,您将自己限制在整个应用程序的一个表视图中,因为您使用的键对应于不唯一的整数。然而,更明显的是,您的代码中有许多拼写错误会导致编译失败。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-11
    • 2011-02-19
    • 1970-01-01
    • 2014-01-15
    • 2023-03-22
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多