位置回调后 UITableViewCell 不更新,直到滚动或选择
UITableViewCell not updating after location callback until scroll or selection
我正在尝试在找到用户位置并进行反向地理编码后立即更新 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。有人知道吗?
更新:我的解决方案
缺少的部分是在单元格 created/dequeued 之后添加 [cell layoutSubviews]
。 detailTextLabel 现在可以正确更新。显然,这可能与一个 iOS8 错误有关,如果 detailText 开始时为 nil(即没有内容),它不会更新 detailText,而 layoutSubviews 通过初始化单元格的所有子视图使其不为 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
?
在view.In这种情况下,tableview 单元格似乎并不完全可见您可以使用[cell setNeedsDisplay];例如:dispatch_async(dispatch_get_main_queue(), ^{ [cell setNeedsDisplay];
[cell.contentView addSubview:yourView];
});
希望这对你有用。
我遇到了同样的问题。 None 这里的答案对我有用。我最终搜索了笔尖的各个方面,发现我的控件(按钮和 table 视图)没有连接到插座,即使在 .h 文件中选择了圆形指示器。但是在连接检查器中,它们没有连接到网点。因此不得不删除所有 .h 文件控件并重新连接,然后低电平,一切正常。
我正在尝试在找到用户位置并进行反向地理编码后立即更新 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。有人知道吗?
更新:我的解决方案
缺少的部分是在单元格 created/dequeued 之后添加 [cell layoutSubviews]
。 detailTextLabel 现在可以正确更新。显然,这可能与一个 iOS8 错误有关,如果 detailText 开始时为 nil(即没有内容),它不会更新 detailText,而 layoutSubviews 通过初始化单元格的所有子视图使其不为 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
?
在view.In这种情况下,tableview 单元格似乎并不完全可见您可以使用[cell setNeedsDisplay];例如:dispatch_async(dispatch_get_main_queue(), ^{ [cell setNeedsDisplay];
[cell.contentView addSubview:yourView];
});
希望这对你有用。
我遇到了同样的问题。 None 这里的答案对我有用。我最终搜索了笔尖的各个方面,发现我的控件(按钮和 table 视图)没有连接到插座,即使在 .h 文件中选择了圆形指示器。但是在连接检查器中,它们没有连接到网点。因此不得不删除所有 .h 文件控件并重新连接,然后低电平,一切正常。