2013-04-24 5 views
0

У меня есть вид таблицы, где каждая ячейка может играть сообщение, аналогичного показанному голосовой почты таблицы из Iphone с той разницей, что ползунок и прогресс меткой является частью клетки: Apple's Voicemail audio cells http://apcmag.com/images/iphone-voicemail.jpgпользовательских UITableViewCell исчезают при хранении в MEMVAR

Таблица связана с CoreData, где каждый управляемый объект содержит ссылку на аудиофайлы для ячеек таблицы.

Поскольку метки воспроизведения, слайдера и времени воспроизведения звука являются частью каждой ячейки, каждый AudioCell (который является пользовательской ячейкой, наследующей от UITableViewCell) содержит объект AVAudioPlayer для ответа на действия пользователя (например, воспроизведение, пауза , и т.д...).

Когда я начинаю воспроизводить звук из ячейки, мне нужно сохранить эту ячейку в memvar, чтобы объект AVAudioPlayer внутри ячейки мог продолжать воспроизводить звук, а метки и слайдер обновлены правильно. Вот код, где я «сохранить» аудио воспроизведения ячейку MEMVAR: #pragma знак - AudioCellDelegate

- (void)playbackChangedForAudioCell:(AudioCell *)audioCell 
{ 
    if (self.audioPlayingCell.isPlaying && ![self.audioPlayingCell isEqual:audioCell]) { 
     [self.audioPlayingCell stopPlayback]; 
    } 

    if (audioCell.isPlaying) { 
     self.audioPlayingCell = audioCell; 
    } else{ 
     self.audioPlayingCell = nil; 
    } 

    // Mark the message as played. 
    Message *message = (Message *)[[self fetchedResultsControllerForTableView:self.tableView] objectAtIndexPath:audioCell.cellIndexPath]; 

    [self messageSeenByUser:message]; 
} 

Вот соответствующий код, где ячейка «восстанавливается» из MEMVAR, если он соответствует NSIndexPath что в настоящее время играет аудио:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSManagedObject *managedObject = [[self fetchedResultsControllerForTableView:tableView] objectAtIndexPath:indexPath]; 

    UITableViewCell *cell = nil; 

    // Implement any new kind of message here. 
    if ([managedObject isKindOfClass:[VoicemailMessage class]]) 
    { 
     if ([self.audioPlayingCell.cellIndexPath isEqual:indexPath]) 
      cell = self.audioPlayingCell; 
     else { 
      AudioCell *audioCell = (AudioCell *)[self setupCellForVoicemail:(VoicemailMessage*)managedObject]; 
      audioCell.cellIndexPath = indexPath; 
      cell = audioCell; 
     } 
    } 

проблема в том, что, когда NSManagedObject обновляется:

- (void)messageSeenByUser:(Message *)message 
{ 
    if (self.view.window) { 
     if ([message.isNew boolValue]) 
     { 
      message.isNew = [NSNumber numberWithBool:NO]; 
      [[NSNotificationCenter defaultCenter] postNotificationName:MessageBadgeNotification object:self]; 
     } 
    } 
} 

клетка исчезает п (пространство все еще существует, но я не вижу виджета из ячейки).

НО, если никаких изменений в объекте NSManagedObject и перезагрузка таблицы не исчезает.

Я хотел бы знать, что может привести к исчезновению ячейки, что-то должно отличаться от обычного обновления табличного представления и изменения управляемого объекта.

ответ

0

Я получил это работает, проблема, кажется, увядает анимация, которая добавляется, когда ячейка должна быть обновлена ​​с Managed изменения объекта по адресу:

- (void)controller:(NSFetchedResultsController *)controller 
    didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath 
    forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath 
{ 
    UITableView *tableView = self.tableView; 

    switch(type) 
    { 
     case NSFetchedResultsChangeInsert: 
      [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      self.insertedRow = YES; 
      break; 

     case NSFetchedResultsChangeDelete: 
      [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
      break; 

     case NSFetchedResultsChangeUpdate: 
        [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];// Do not add an animation or the voicemail cell will 

На NSFetchedResultsChangeUpdate, вместо того, чтобы сделать его использовать fade animation, я не добавляю анимацию и, похоже, решил проблему с исчезновением ячейки.

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