2014-02-25 54 views
3

我有一個嵌入到UITableViewCell中的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.


注:如果配圖使用JIT的實現代碼如下是laggy。因此,我爲它創建了一個iVar並且早些時候啓動它。

+0

你忘了打電話給viewDidAppear的超級實現。 –

+0

是的,儘管這不是原因。 (這是一個快速寫作,我錯過了)(已添加) – Byte

回答

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]; 
+0

對! +1非常好寫! – Byte

+0

謝謝!一直在抓我的頭! – nehz

1

這真的很奇怪,因爲你的代碼看起來不錯。我能夠重新加載部分,並顯示使用該代碼的單元格:

[CATransaction begin]; 

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

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

[CATransaction commit]; 

但是,這是一個多解決一個解決方法。

+0

作爲解決方法,只需使用[self.tableView reloadData]代替reloadSections和CATransaction代碼。 –

+0

兩者都是絕對的解決方法。但是,他們會調用reloadData,然後再調用其他部分以重新加載。這可能會耗費流程中的資源。謝謝您的意見!但是對於動畫+1。 – Byte