Ios UITableViewCell在位置回调后不更新,直到滚动或选择

Ios UITableViewCell在位置回调后不更新,直到滚动或选择,ios,objective-c,iphone,uitableview,Ios,Objective C,Iphone,Uitableview,我试图在找到用户的位置并进行反向地理编码后立即更新UITableViewCell 从阅读了许多类似问题的其他答案来看,似乎tableview重载必须发生在主线程上,我已经尝试过,但没有成功 所有位置数据都被正确检索,并正确添加到核心数据对象中,但tableview单元格在用户滚动或选择单元格之前不会更新,此时单元格从该点开始正确更新 下面是我代码中的一个选择-有人知道为什么tableview单元格没有立即更新吗 - (void)locationManager:(CLLocationManager

我试图在找到用户的位置并进行反向地理编码后立即更新UITableViewCell

从阅读了许多类似问题的其他答案来看,似乎tableview重载必须发生在主线程上,我已经尝试过,但没有成功

所有位置数据都被正确检索,并正确添加到核心数据对象中,但tableview单元格在用户滚动或选择单元格之前不会更新,此时单元格从该点开始正确更新

下面是我代码中的一个选择-有人知道为什么tableview单元格没有立即更新吗

- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations  // Delegate callback method.
{       

    // Correctly gets currentLocation coordinates.
    ...
    CLLocation *currentLocation = [locations lastObject];
    ...

    // Reverse-geocode the coordinates (find physical address):
    [geocoder reverseGeocodeLocation:currentLocation completionHandler:^(NSArray *placemarks, NSError *error) {

        if (error == nil && [placemarks count] > 0) {
            CLPlacemark *placemark = [placemarks lastObject]; // Correctly gets placemark.

            //    Correctly adds placemark to core data object.
            ...
            ...

            // Reload TableView:
            //    [self.tableView reloadData];  //Tried this, didn't work, since not on main thread.
            //    [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];  //Doesn't work.
            //    [self performSelector:(@selector(refreshDisplay)) withObject:nil afterDelay:0.5];  //Doesn't work.
            [self performSelectorOnMainThread:@selector(refreshDisplay) withObject:nil waitUntilDone:NO];  //Doesn't work.
        }
    }];
}

- (void)refreshDisplay {
    [_tableView reloadData];
}
同样,底层逻辑也在工作,因为数据被正确添加并最终显示在单元格上,但直到用户滚动或选择为止。我无法想象为什么不立即刷新tableviewcell。有人知道吗

更新:我的解决方案

缺少的部分是在创建/退出单元格队列后添加
[cell layoutSubviews]
。detailTextLabel现在可以正确更新。显然,这可能与iOS8错误有关,该错误在detailText开始时为零(即没有内容),而layoutSubviews通过初始化单元格的所有子视图(据我所知)使其不为零。我从这里得到了这个建议:


被接受的答案也帮助我找到了这个缺失的部分。

您应该获得一个要更新的单元格的引用

例如,
UITableViewCell*cell=[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:theRow inSection:theSection]]

然后
[[cell textlab]setText:theLocation]

如果更新多个单元格,只需获取要更新的单元格的多个引用,并相应地更新它们

通常,处理需要更新的UI组件的任何操作都应该在主线程上完成。我以前也遇到过这个问题,但如果您想找到一个处理线程的解决方案,那么您所做的似乎应该是可行的

以下是GCD解决方案:

dispatch_async(dispatch_get_main_queue(), ^{
    [self.table reloadData];
});
但根据你所做的,这不应该有帮助。。。这与GCD基本相同。希望我一开始给你的解决方案能奏效

编辑

在您的
-(UITableView单元格*)tableView:(UITableView*)tableView单元格中,用于下一步的geatindexpath:(nsindepath*)indepath

    cell = [[PFTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"];

您是否将样式设置为
UITableViewCellStyleDefault

似乎tableview单元格在视图中不完全可见。在这种情况下,您可以使用[cell setNeedsDisplay];例如:dispatch_async(dispatch_get_main_queue(),^{[cell setNeedsDisplay]

    [cell.contentView addSubview:yourView];
});

希望这对你有用。

我也有同样的问题。这里的答案对我都不起作用。我最终搜索了笔尖的各个方面,看到我的控件(按钮和表格视图)即使在.h文件中选择了圆圈指示器,但未连接到插座。但是在连接检查器中,它们未连接到插座。因此,必须删除所有的.h文件控件,然后重新连接并降低,然后一切正常。

感谢您的快速响应!我尝试了您的建议,奇怪的是如果它正在修改textLabel,则可以工作,但我需要它来修改detailTextLabel(字幕标签),当我简单地将
[[cell textLabel]…
更改为
[[cell detailTextLabel]…
时,它不再工作(我假设它只更新了单元格的一部分,而不是整个内容)。正如您所建议的,我已将所有内容放入dispatch_async块中。我使用的是
UITableViewCellStyleSubtitle
,因为位置数据进入了字幕。但我不会这样分配初始化,它是在情节提要中设置的,然后使用单元格出列进行检索,如:
UITableViewCell*cell=[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
Hmm…因此,
detailTextLabel
没有被更新,但是
textLabel
是吗?这很奇怪…我会给你回电话的。我想我可能已经找到了答案。似乎我需要添加
[cell LayoutSubview]
在创建/退出单元格后。这会根据上述方法立即正确更新detailTextLabel。显然,这可能与iOS8错误有关,如果detailText开始时为零,则不会更新,而layoutSubviews通过初始化单元格的子视图使其变为非零(据我所知)。我从这里得到了这个建议:。不过我认为这是一个正确的答案,因为它帮助我找到了这个解决方案:)太好了!我很高兴你解决了这个问题。我也很高兴我帮助你走上了正确的道路。嗨,不要把所有的东西都放在一行。这很难理解:-)请了解有关在StackOverflow上发布答案的信息现代编辑器通常是软包装(例如邮件),并且比硬cr/lf字符更可取。我如何知道每个用户在一行上有多少个字符????