• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 04:43:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

一旦找到用户的位置并进行反向地理编码,我就会尝试更新 UITableViewCell。

通过阅读许多其他类似问题的答案,似乎 tableview 重新加载必须发生在主线程上,我尝试过但没有成功。

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

这是我的代码中的一个选择 - 有谁知道为什么 tableview 单元格没有立即更新?

- (void)locationManagerCLLocationManager *)manager didUpdateLocationsNSArray *)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 performSelectorOnMainThreadselector(reloadData) withObject:nil waitUntilDone:NO];  //Doesn't work.
            //    [self performSelector@selector(refreshDisplay)) withObject:nil afterDelay:0.5];  //Doesn't work.
            [self performSelectorOnMainThreadselector(refreshDisplay) withObject:nil waitUntilDone:NO];  //Doesn't work.
        }
    }];
}

- (void)refreshDisplay {
    [_tableView reloadData];
}

再一次,底层逻辑正在工作,因为数据被正确添加并最终显示在单元格上,但直到用户滚动或选择。我无法想象为什么这不会立即刷新 tableviewcell。有人知道吗?

更新:我的解决方案

缺少的部分是在单元格创建/出列之后添加 [cell layoutSubviews]。 detailTextLabel 现在可以正确更新。显然,这可能与一个 iOS8 错误有关,如果它开始为 nil(即没有内容),则不会更新 detailText,并且 layoutSubviews 通过初始化单元格的所有 subview (就我而言)使它不是 nil理解)。我从这里得到了这个建议:

ios 8 UITableViewCell detail text not correctly updating

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



Best Answer-推荐答案


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

例如。 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 *)tableViewUITableView *)tableView cellForNextPageAtIndexPathNSIndexPath *)indexPath

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

您是否将样式设置为 UITableViewCellStyleDefault

关于ios - UITableViewCell 在位置回调后不更新,直到滚动或选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27866009/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap