2015-04-22 2 views
0

Я добавляю строки в UITableView с использованием метода insertRowsAtIndexPaths. Я помещаю этот код между [myTable beginUpdates]; и [myTable endUpdates];. Проблема в том, что моя таблица мигает, а затем прокручивается до последней строки?UITableView мигает, если я делаю insertRowsAtIndexPaths

В чем может быть проблема? Если я прокомментирую [myTable beginUpdates]; и [myTable endUpdates];: тогда он отлично работает.

Спасибо заранее!

Вот мой код:

#pragma mark - NSFetchResultController 
- (void)setFetchedResultsController:(NSFetchedResultsController*)fetchedResultsController 
{ 
    _fetchedResultsController = fetchedResultsController; 
    fetchedResultsController.delegate = self; 
    [fetchedResultsController performFetch:NULL]; 
} 

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller { 
    [tblComments beginUpdates]; 
} 

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath { 
    switch (type) { 
     case NSFetchedResultsChangeInsert: { 
      [tblComments insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      postUpdateScrollTarget = newIndexPath; 
      break; 
     } 
     case NSFetchedResultsChangeDelete: { 
      [tblComments deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
     } 
     case NSFetchedResultsChangeUpdate: { 
      [self configureCell:(LFMCommentCell *)[tblComments cellForRowAtIndexPath:indexPath] atIndexPath:indexPath]; 
      //[tblComments reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
     } 
     case NSFetchedResultsChangeMove: { 
      [tblComments deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      [tblComments insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
     } 
    } 
} 

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller { 

    [tblComments endUpdates]; 

    if (postUpdateScrollTarget) 
    { 
     [tblComments scrollToRowAtIndexPath:postUpdateScrollTarget atScrollPosition:UITableViewScrollPositionBottom animated:NO]; 
    } 
    postUpdateScrollTarget = nil; 
} 
+1

Вы можете поставить, пожалуйста, код между beginUpdates и endUpdates –

+0

Любая идея @ Хамза GHAZOUANI – NSPratik

+2

пожалуйста, вы можете добавить свой код в вопросе, в комментариях не lisible :) –

ответ

1

Я не понимаю вопрос очень хорошо, если вопрос заключается в том, чтобы вставить/удалить ячейки табличного представления, мы должны помнить: количество строк, содержащиеся в существующий раздел после обновления должен быть равен количеству строк, содержащихся в этом разделе перед обновлением, плюс или минус количество строк, вставленных или удален из этой секции

Пример:

class FruitsTableViewController: UITableViewController { 

var fruits = ["Apple", "Banana", "Orange", "Pear", "Cherry"] 

// MARK: View LifeCycle 

override func viewDidLoad() { 
    super.viewDidLoad() 
} 

override func viewDidAppear(animated: Bool) { 
    super.viewDidAppear(animated) 

    // delete one cell randomly one seconde after the view appear 
    NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: "deleteOneCellRandomly", userInfo: nil, repeats: false); 

    // add on cell in the top after 2 secondes 
    NSTimer.scheduledTimerWithTimeInterval(2.0, target: self, selector: "addOneCellInTheTop", userInfo: nil, repeats: false); 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 

// MARK: - managing TableView cells 

func deleteOneCellRandomly() { 
    let rowIndex = Int(arc4random_uniform(UInt32(fruits.count))) 
    let indexPathToDelete = NSIndexPath(forRow: rowIndex, inSection: 0) 

    tableView.beginUpdates() 
    fruits.removeAtIndex(rowIndex) 
    tableView.deleteRowsAtIndexPaths([indexPathToDelete], withRowAnimation: UITableViewRowAnimation.Automatic) 
    tableView.endUpdates() 
} 

func addOneCellInTheTop() { 
    let rowIndex = 0 
    let indexPathToDelete = NSIndexPath(forRow: rowIndex, inSection: 0) 

    tableView.beginUpdates() 
    fruits.insert("Grape", atIndex: rowIndex) 
    tableView.insertRowsAtIndexPaths([indexPathToDelete], withRowAnimation: UITableViewRowAnimation.Automatic) 
    tableView.endUpdates() 
} 

// MARK: - Table view data source 

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return fruits.count 
} 


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("reuseIdentifier", forIndexPath: indexPath) as UITableViewCell 

    cell.textLabel?.text = fruits[indexPath.row] 

    return cell 
} 

}

Надежда, что помогает

Смежные вопросы