UITableViewCell重新加载后,MKMapView变为白色

时间:2014-02-25 19:26:08

标签: ios uitableview mkmapview

我有一个嵌入UITableViewCell的MKMapView。有时,该部分会重新加载。问题是当刷新发生时,地图单元决定突然变白。

这是基本代码

- (void)viewDidLoad
{
    [super viewDidLoad];

    _mapCell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Map"];
    [_mapCell setSelectionStyle:UITableViewCellSelectionStyleNone];
    [_mapCell setBackgroundColor:[UIColor greenColor]];

    _mapView = [[MKMapView alloc] init];
    [_mapView setTranslatesAutoresizingMaskIntoConstraints:NO];
    [_mapCell.contentView addSubview:_mapView];

    [_mapCell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_mapView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(_mapView)]];
    [_mapCell.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_mapView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(_mapView)]];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    [_mapCell setSelectionStyle:UITableViewCellSelectionStyleNone];
    return _mapCell;
}

重装代码

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
        [self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationAutomatic];
    });
}

Here is the sample project to demonstrate the problem.


注意:如果与map一起使用,则表格视图的JIT会滞后。因此,我为它创建了一个iVar并在之前初始化它。

2 个答案:

答案 0 :(得分:2)

来自docs

reloadSections:withRowAnimation:
Reloads the specified sections using a given animation effect.

- (void)reloadSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation
Parameters
sections  An index set identifying the sections to reload.
animation A constant that indicates how the reloading is to be animated, for 

The animation constant affects the direction in which both the old and the new section rows slide. For example, if the animation constant is UITableViewRowAnimationRight, the old rows slide out to the right and the new cells slide in from the right.
Discussion
Calling this method causes the table view to ask its data source for new cells for the specified sections. The table view animates the insertion of new cells in as it animates the old cells out. Call this method if you want to alert the user that the values of the designated sections are changing. If, however, you just want to change values in cells of the specified sections without alerting the user, you can get those cells and directly set their new values.

具体地

  

动画常量会影响旧的方向   并且新的部分行滑动。例如,如果动画不变   是UITableViewRowAnimationRight,旧行向右滑动   并且新细胞从右侧滑入。

您正在返回表视图尝试通过动画移动的同一个单元格。 这就是地图视图消失的原因。

您必须使用此部分来解决

  

但是,如果您只想更改指定单元格中的值   没有警告用户的部分,你可以得到那些细胞和   直接设置他们的新值。

使用UITableViewRowAnimationNone也可以

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0] withRowAnimation:UITableViewRowAnimationNone];

答案 1 :(得分:1)

这很奇怪,因为你的代码看起来不错。我能够重新加载该部分并使用以下代码显示单元格:

[CATransaction begin]; 

[CATransaction setCompletionBlock:^
{ 
     [self.tableView reloadData];
}];

[self.tableView reloadSections:[NSIndexSet indexSetWithIndex:0]    
              withRowAnimation:UITableViewRowAnimationAutomatic];

[CATransaction commit];

但这更像是一种解决方法,而不是修复方法。