当存储为memvar时,自定义UITableViewCell将消失

当存储为memvar时,自定义UITableViewCell将消失,uitableview,nsmanagedobject,voicemail,Uitableview,Nsmanagedobject,Voicemail,我有一个表格视图,每个单元格都可以播放一条消息,类似于iphone的语音邮件表格视图,区别在于滑块和进度标签是单元格的一部分: (来源:) 该表与CoreData关联,其中每个托管对象都包含指向表视图单元格音频文件的链接 由于播放按钮、滑块和音频时间进度标签是每个单元的一部分,因此每个音频单元(从UITableViewCell继承的自定义单元)都包含一个AVAudioPlayer对象,用于响应用户操作(例如播放、暂停等) 当我开始播放单元格中的音频时,我需要将该单元格保存在memvar中,以便

我有一个表格视图,每个单元格都可以播放一条消息,类似于iphone的语音邮件表格视图,区别在于滑块和进度标签是单元格的一部分:
(来源:)

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

由于播放按钮、滑块和音频时间进度标签是每个单元的一部分,因此每个音频单元(从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];
}
以下是相关代码,如果单元格与当前正在播放音频的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没有更改,并且表重新加载,则单元格不会消失


我想知道是什么原因导致单元格消失,一定与常规表视图更新和托管对象更改有所不同。

我已经开始工作,问题似乎是当单元格需要在以下位置使用托管对象更改进行更新时添加的淡入淡出动画:

- (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,我没有添加任何动画,而是使用淡入淡出动画,这似乎解决了细胞消失的问题

我仍然不确定是什么原因导致细胞随着淡入淡出动画而消失,但至少在这一变化之后它现在不会消失。如果有人知道它为什么会随着淡入淡出动画而消失,欢迎发表评论