各セルがメッセージを再生できるテーブル ビューがあります。iPhone のボイスメール テーブル ビューに似ていますが、スライダーと進行状況ラベルがセルの一部である点が異なります:
(ソース: apcmag.com )
テーブルは 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 に変更がなく、テーブルがリロードされた場合、セルは消えません。
セルが消える原因を知りたいのですが、通常のテーブル ビューの更新や管理対象オブジェクトの変更とは何かが違うはずです。