我有一个表视图,每个单元格都可以播放一条消息,类似于iphone的语音邮件表视图,区别在于滑块和进度标签是单元格的一部分: Apple's Voicemail audio cells http://apcmag.com/images/iphone-voicemail.jpg
该表与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没有变化,表重新加载,则单元格不会消失。
我想知道导致单元格消失的原因,必须与常规表格视图更新和托管对象更改有所不同。
答案 0 :(得分: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,而不是让它使用淡入淡出动画,我没有添加任何动画,这似乎解决了细胞消失的问题。
我仍然不确定是什么原因可能会导致细胞随着淡入淡出动画消失,但至少在此更改后它现在不会消失。如果有人知道为什么它会随着淡入淡出的动画而消失,欢迎发表评论。