使用调度机制时未单击Tableview单元格

时间:2012-08-16 22:31:13

标签: iphone objective-c ios cocoa ipad

我正在尝试使用调度机制来获取背景上的内容,并且一旦获取它就更新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;

2 个答案:

答案 0 :(得分: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

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

更新

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

答案 1 :(得分:1)

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

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

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