草庐IT

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

coder 2024-01-24 原文

我正在尝试在找到用户位置并进行反向地理编码后立即更新 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 开始时为 nil(即没有内容),它不会更新 detailText,而 layoutSubviews 通过初始化单元格的所有 subview (据我所知)使其不为 nil理解)。我从这里得到了这个建议:

ios 8 UITableViewCell detail text not correctly updating

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

最佳答案

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

例。 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

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

有关ios - 位置回调后 UITableViewCell 不更新,直到滚动或选择的更多相关文章

  1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. ruby - 匹配大写字母并用后续字母填充,直到一定的字符串长度 - 2

    我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种

  6. ruby - 有人可以帮助解释类创建的 post_initialize 回调吗 (Sandi Metz) - 2

    我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法

  7. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  8. ruby - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

  9. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  10. ruby - 正则表达式在哪个位置失败? - 2

    我需要一个非常简单的字符串验证器来显示第一个符号与所需格式不对应的位置。我想使用正则表达式,但在这种情况下,我必须找到与表达式相对应的字符串停止的位置,但我找不到可以做到这一点的方法。(这一定是一种相当简单的方法……也许没有?)例如,如果我有正则表达式:/^Q+E+R+$/带字符串:"QQQQEEE2ER"期望的结果应该是7 最佳答案 一个想法:你可以做的是标记你的模式并用可选的嵌套捕获组编写它:^(Q+(E+(R+($)?)?)?)?然后你只需要计算你获得的捕获组的数量就可以知道正则表达式引擎在模式中停止的位置,你可以确定匹配结束

随机推荐