0

各セルがメッセージを再生できるテーブル ビューがあります。iPhone のボイスメール テーブル ビューに似ていますが、スライダーと進行状況ラベルがセルの一部である点が異なります: (ソース: apcmag.com )Apple のボイスメール オーディオ セル

テーブルは 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 に答える