2017-06-27 28 views
2

reloadRowsAtIndexPathsを呼び出すたびに; didEndDisplayingCellメソッドが2回呼び出されます。なぜこうなった?iOS:reloadRowsAtIndexPathsを呼び出すと、didEndDisplayingCellが2回呼び出されます

私はUITableViewDelegateとUITableViewDataSourceのデリゲートメソッド次実装しました:

  • - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

  • - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

  • - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath

didEndDisplayingCellを実装したのは、Firebaseリスナーを切り離したいからです。ここで

は、私は、セルが更新されたデータに耳を傾けたび、それはtableViewCellをリロードするのViewControllerのメソッドを起動didEndDisplayingCell

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath{ 
// detach the listener for the cell at path index indexPath 

    CustomCell* customCell = (CustomCell*)(cell); 
    [customCell detachListener]; 
} 

内部に実装するものです。

  1. numberOfRowsInSection
  2. cellForRowAtIndexPath
  3. didEndDisplayingCell
  4. didEndDisplayingCell
  5. :このメソッドはのUITableViewのデリゲートメソッドは次の順序どおりに呼ばれて実行されると

    -(void)refreshCellWithIndexPath:(NSIndexPath*) indexPath andData:(CustomData*)data{ 
    
        [self.dataArray replaceObjectAtIndex:indexPath.row withObject:data]; 
    
        [self.tableView beginUpdates]; 
        [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
        [self.tableView endUpdates]; 
    } 
    

    :ここで私は、そのメソッドを実装する方法です

なぜdidEndDisplayingCellメソッドが2回目に呼び出されますか?これを手伝ってください。

+0

理由/液に '' didEndDisplayingCell'に重複通話用indexPath' ... *かもしれない*ヘルプポイントの値を見るのは興味深いだろう。 – DonMag

+0

@DonMag、迅速な対応に感謝します。 'didEndDisplayingCell'への重複呼び出しの' indexPath'は同じです。 –

+0

Hmmm ... indexPathは意味がありますか?セル*が削除されるべきであるように見えますか? – DonMag

答えて

0

可能な回避策:

reloadCounter += 1 
CATransaction.begin() 
tableView.beginUpdates() 
CATransaction.setCompletionBlock { 
    self.reloadCounter -= 1 
} 
tableView.reloadRows(at: [IndexPath(row: row, section: 0)], with: .none) 
tableView.endUpdates() 
CATransaction.commit() 

reloadCounterがIVARです:

代わり

[self.tableView beginUpdates]; 
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
[self.tableView endUpdates]; 

使用(SWIFT)の。

とdidEndDisplayingで:

func tableView(_ tableView: UITableView, didEndDisplaying cell: UITableViewCell, forRowAt indexPath: IndexPath) { 
    if (reloadCounter == 0) { 
     self.output.didEndDisplaying(viewModel: dataProvider.items[indexPath.row]) 
    } 
} 
関連する問題