0

我正在尝试利用调度机制来获取后台内容,并在获取后更新tableview,但是,这种机制有效,但是一旦重新加载,tableviewcell 就无法点击。当我删除 [self._tableView reloadData] 时,它是可点击的。下面是我的代码。有什么建议么?

NSString *const cellIdentifier = @"AutoFill";    
    UITableViewCell *cell = [_tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);

dispatch_async(queue, ^{
    NSString *te = [tableData objectAtIndex:indexPath.row];
    NSArray *a = [te componentsSeparatedByString:@" "];

    dispatch_sync(dispatch_get_main_queue(), ^{

        cell.accessoryType = UITableViewCellAccessoryNone;
        [self._tableView reloadData];
    });
});


return cell;
4

2 回答 2

3

无需在后台访问该数组 - 您只是为了增加复杂性而增加复杂性,这从来没有用处。

- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload
- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload
- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload
- The tableView loads it's data and asks the dataSource for a row
- You create a row but then ask the table to reload

我认为你说对了...

reloadData当您提供将显示在 tableView 中的行时,您不应该调用

请注意,如果您做了正常的事情并且没有在后台获取数据,这甚至不是您必须担心的问题

更新

您的代码在后台访问一个数组 - 对它没有任何用处,然后回调主线程以设置一个属性,该属性甚至不是由后台线程中的工作结果确定的。你到底想达到什么目的?

于 2012-08-16T23:14:54.623 回答
1

你陷入了无限循环。当您调用reloadData它时,它会强制表重新加载,然后调用:

- (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

然后你重新开始。您应该更新单元格,而不是表格。尝试[cell setNeedsLayout];[cell.contentView setNeedsLayout];

于 2012-08-16T23:14:25.823 回答