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

Posted

技术标签:

【中文标题】UITableViewCell 在位置回调后不更新,直到滚动或选择【英文标题】:UITableViewCell not updating after location callback until scroll or selection 【发布时间】:2015-01-09 17:30:46 【问题描述】:

一旦找到用户的位置并进行反向地理编码,我就会尝试更新 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 错误有关,如果它开始为 nil(即没有内容),则不会更新 detailText,并且 layoutSubviews 通过初始化单元格的所有子视图(就我而言)使它不是 nil理解)。我从这里得到了这个建议:

ios 8 UITableViewCell detail text not correctly updating

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

【问题讨论】:

【参考方案1】:

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

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

然后[[cell textLabel] setText:theLocation];

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

通常情况下,处理需要更新的 UI 组件的任何事情都应该在主线程上完成。我以前遇到过这个问题,但是如果你想有一个处理线程的解决方案,你所做的似乎应该可以工作。

这里是 GCD 解决方案:

dispatch_async(dispatch_get_main_queue(), ^
    [self.table reloadData];
);

但根据你所做的,它应该没有帮助......它与 GCD 基本上是一样的。希望我一开始给你的解决方案能奏效......

编辑

在您的- (UITableViewCell *)tableView:(UITableView *)tableView cellForNextPageAtIndexPath:(NSIndexPath *)indexPath

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

您是否将样式设置为UITableViewCellStyleDefault

【讨论】:

感谢您的快速回复!我尝试了你的建议,奇怪的是如果它在修改textLabel它可以工作,但是我需要它来修改detailTextLabel(字幕标签),当我简单地将[[cell textLabel]...更改为[[cell detailTextLabel]...时,它不再有效(我假设是因为它只是更新单元格的一部分,而不是整个东西)。正如您所建议的,我已将所有内容放入 dispatch_async 块中。 我正在使用UITableViewCellStyleSubtitle,因为位置数据进入了字幕。我不会像这样分配初始化它,它是在情节提要中设置的,然后使用单元出队检索,如下所示:UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 嗯...所以detailTextLabel 没有更新,但textLabel 是?这很奇怪......我会回复你 我想我可能已经明白了。看来我需要在单元格创建/出列之后添加[cell layoutSubviews];。现在,这会根据您上面描述的方法正确更新 detailTextLabel。显然,这可能与一个 iOS8 错误有关,如果它开始为 nil,则不会更新 detailText,并且 layoutSubviews 通过初始化单元格的子视图(据我了解)使其不是 nil。我从这里得到了这个建议:***.com/a/27003639/3629626。不过,我将此标记为正确答案,因为它帮助我找到了这个解决方案:) 甜蜜!我很高兴你解决了这个问题。我很高兴能帮助你走上正确的道路。【参考方案2】:

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

    [cell.contentView addSubview:yourView];
);

希望这对你有用。

【讨论】:

【参考方案3】:

我遇到了同样的问题。这里没有一个答案对我有用。我终于搜索了笔尖的各个方面,发现我的控件(按钮和表格视图)没有连接到插座,即使在 .h 文件中选择了圆形指示器。但是在连接检查器中,它们没有连接到插座。所以不得不删除所有 .h 文件控件并重新连接,然后看一切正常。

【讨论】:

嗨,不要把所有的都放在一行中。很难阅读 :-) 请了解有关在 *** 上发布答案的知识 现代编辑器通常采用软包装(例如邮件),比硬 cr/lf 字符更可取。我怎么知道每个用户一行有多少个字符????

以上是关于UITableViewCell 在位置回调后不更新,直到滚动或选择的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 位置问题内的 UIView - 已更新

LocationListener 在 android 服务中的某个时间后不提供更新

ngAnimate,addClass 回调在动画结束后不运行

mongoose.connect 在连接到 mongodb 后不调用回调

小程序微信支付接口成功后不回调

在 UITableViewCell 中设置动态子视图位置