0

我有一个表格视图,每个单元格都可以播放一条消息,类似于 iphone 的语音邮件表格视图,不同之处在于滑块和进度标签是单元格的一部分:( 来源:apcmag.comApple 的语音信箱音频单元

该表与 CoreData 相关联,其中每个托管对象都包含指向表视图单元格的音频文件的链接。

由于播放按钮、滑块和音频时间进度标签是每个单元格的一部分,因此每个 AudioCell(继承自 UITableViewCell 的自定义单元格)都包含一个 AVAudioPlayer 对象来响应用户操作(例如播放、暂停等)。 .)。

当我开始播放单元格中的音频时,我需要将该单元格保存在 memvar 中,以便单元格内的 AVAudioPlayer 对象可以继续播放音频并且标签和滑块会正确更新。这是我将音频播放单元“保存”到 memvar 的代码:#pragma mark - 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];
}

这是相关代码,如果它与当前正在播放音频的 NSIndexPath 匹配,则从 memvar 中“恢复”单元格:

- (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 没有更改并且表重新加载,则单元格不会消失。

我想知道是什么导致单元格消失,某些东西必须不同于常规的表格视图更新和托管对象的更改。

4

1 回答 1

0

我让它工作了,问题似乎是当单元格需要使用托管对象更改更新时添加的淡入淡出动画:

- (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 中,我没有添加任何动画,而不是让它使用淡入淡出动画,这似乎解决了单元格消失的问题。

我仍然不确定是什么导致单元格随着淡入淡出动画消失,但至少在此更改后它现在不会消失。如果有人知道它为什么随着淡入淡出动画消失,欢迎评论。

于 2013-04-25T00:16:15.467 回答