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

时间:2015-01-09 17:30:47

标签: ios objective-c iphone uitableview

我正在尝试在找到用户的位置并进行反向地理编码后立即更新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

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

3 个答案:

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

答案 1 :(得分:0)

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

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

希望这适合你。

答案 2 :(得分:0)

我遇到了同样的问题。这里没有任何答案对我有用。我终于搜遍了笔尖的每个方面,看到我的控件(按钮和表视图)没有连接到插座,即使在.h文件中选择了圆形指示器。但在连接检查员中,他们没有连接到网点。所以不得不删除所有的.h文件控件并重新连接并降低并注意一切正常。