2011-03-16 61 views
0

我正在创建一个函数来跟踪截止日期。当您在截止日期表格视图中选择一行时,我将accessoryType更改为复选标记。这与此代码工作完美:当你选择了一个表格单元格和滚动因此它dissappears,当它再次出现accessoryType再次发生无当UITableViewCell被隐藏时,accessoryTypeCheckmark消失

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    Cell *selectedCell = (Cell *)[tableView cellForRowAtIndexPath: indexPath]; 

    if (selectedCell.accessoryType == UITableViewCellAccessoryNone) { 
     [Deadline setDone: TRUE onIndex:indexPath.row]; 
     selectedCell.accessoryType = UITableViewCellAccessoryCheckmark; 

    } else { 
     [Deadline setDone: FALSE onIndex:indexPath.row]; 
     selectedCell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    [tableView deselectRowAtIndexPath:indexPath animated: YES]; 
} 

的问题。

我在的cellForRowAtIndexPath决定accessoryType代码:

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

    Deadline *d = [self.arrDeadlines objectAtIndex:indexPath.row]; 

    Cell *currCell = (Cell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (currCell == nil) 
    { 
     UIViewController *c = [[UIViewController alloc] initWithNibName:@"Cell" bundle:nil]; 
     currCell = (Cell *)c.view; 
     [c release];   
    } 

    currCell.lblTitle.text = d.name;  

    currCell.accessoryType = d.done == TRUE ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; 

    return currCell; 
} 

如何解决这个问题?

+0

1)回滚完成后,deadline.done返回的值是多少? 2)显示更多'cellForRowAtIndexPath'的代码。你如何管理细胞的出球? – kpower 2011-03-16 10:27:18

+0

1)即使我选择单元格然后取消选择单元格,它总是一样的,因为我无法运行[tableView reloadData]。 2)源代码更新如上! – 2011-03-16 11:35:38

回答

6

您不应该使用TableViewCell来保存数据。 这是数据源的用途,TableViewCell只是数据源中数据的可见表示。

由于单元在不再显示后重新使用,所有数据都会被重置。

因此,在你的UItableViewDataSoucre中,你应该检查一个任务是否完成,并设置accessoryType哟选中标记。

因此,在cellForIndexPath方法中添加一个NSLog,并检查done布尔值是否真的被设置。

+0

在我更新了didSelectRowAtIndexPath方法中的数据源之后,我需要重新加载数据源以便知道某行的值是否已更新,是否正确?因为现在,如果我选中一行以使复选标记显示,然后滚动以便单元格不显示,然后向后滚动选中标记消失!这是因为我没有重新加载数据源?我真的不明白你的回答。 – 2011-03-16 11:54:14

+0

如果数据源是数据的副本,则应重新加载数据源。它看起来是这样的,arrDeadlines看起来像一个数组,它可能是您设置完成状态的数组的副本。 – rckoenes 2011-03-16 11:57:20

+0

你是对的。我在viewDidLoad中创建了一个副本,就像以前一样,我从未使用过更改accessoryType。现在我使用[Deadline getDeadlines]为我的物品分配一个数组。你是怎么想的:我应该从getDeadlines方法中自动释放数组,然后使用[[Deadline getDeadlines] retain],或者你会怎么做?谢谢你解决我的问题! – 2011-03-16 12:07:17