无论选择哪一行,indexPathForSelectedRow始终返回0,0

时间:2011-12-08 21:36:06

标签: objective-c ios uitableview

我想替换自定义单元格触摸的单元格。我这样做是通过调用 reloadRowsAtIndexPaths

来实现的
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    NSLog(@"Row selected: %d",  [tableView indexPathForSelectedRow] row]);
    NSLog(@"Section selected: %d",  [tableView indexPathForSelectedRow] section]);

    //return a custom cell for the row selected
}

当我尝试从 cellForRowAtIndexPath 中访问/记录 indexPathForSelectedRow 时,无论我选择哪个单元格,它都会返回0,0。这是为什么?

1 个答案:

答案 0 :(得分:5)

您对 reloadRowsAtIndexPaths 的调用将导致表视图重新加载给定的单元格,从而导致表格在该位置不再具有选定的行。 cellforRowAtIndexPath 方法是来自数据源的请求,用于为给定的索引路径提供行。如果需要确定在请求之前是否选择了单元格,则可以将所选行的indexPath存储在成员中。然后检查cellForIndexPathMethod中的成员。

以下代码示例假定您使用ARC进行内存管理。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"Cell %d_%d", indexPath.section, indexPath.row];

    // Configure the cell...
    if(selectedIndexPath != nil) {
        NSLog(@"Selected section:%d row:%d", selectedIndexPath.section, selectedIndexPath.row);

        //TODO:Provide a custom cell for the selected one.

        //Set the selectedIndexPath to nil now that it has been handled
        selectedIndexPath = nil;
    }

    return cell;
}

#pragma mark - Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //Store the selected indexPath
    selectedIndexPath = indexPath;

    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
}