5

私のアプリケーションでは、TableViewから行を削除した後に TableView ( [tablView reloadData];)canEditRowAtIndexPathをリロードし、メソッドは常に (以前の)合計行数を呼び出します。

例えば:

TableView に5行ある場合、tableView から1行を削除します。削除後、TableView ( )をリロードしますが、メソッドは4 回 ではなく5 回呼び出しますか??[tablView reloadData]canEditRowAtIndexPath

だから私は常に次のエラーが発生しました:

キャッチされていない例外 'NSRangeException' が原因でアプリを終了しています。理由: ' * **-[__NSArrayM objectAtIndex:]: 境界を超えたインデックス 5 [0 .. 4]'

また、少し遅れて(を使用してNSTimer)テーブルをリロードしようとしましたが、うまくいきませんでした。

ここにいくつかのコードを入れます:

私はそのようなcanEditRowAtIndexPath特定の行に適用します,@"status" isEqualToString:@"directory"

- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"%d", self.listOfSounds.count);
    // Return NO if you do not want the specified item to be editable.
    if([[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"status"] isEqualToString:@"directory"])
        return YES;
    else
        return NO;
}  

削除行のコード:

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB
        [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array
        [self updateListofSoundsFile]; /// Custom method
    }
}

- (BOOL)tableView:(UITableView *)tableView shouldIndentWhileEditingRowAtIndexPath:(NSIndexPath *)indexPath
{
    return NO; // i also tried to  return YES;
}

これが私updateListofSoundsFileのカスタムメソッドコードです:

-(void)updateListofSoundsFile
{
    if(self.listOfSounds.count > 0)
        [self.listOfSounds removeAllObjects];

    self.listOfSounds = [self.sql_ getAllDataFromAudioTable]; // get all record from DB
    NSLog(@"%d",self.listOfSounds.count);

    [self.tblView reloadData];  
}

この問題を解決するにはどうすればよいですか?
ありがとう :)

4

5 に答える 5

5

テーブルビューではなく配列からアイテムを削除するため、配列からアイテムを削除し、この行を使用してデータをリロードする前に、テーブルビューから生を削除する必要があります。

[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB

        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array

        [self updateListofSoundsFile]; /// Custom method
    }
}
于 2013-08-23T04:59:09.397 に答える
0

私の場合、以下のように分析しました。

回答でコメントしたようrmaddyに:Nitin Gohel's

  1. テーブルを更新する前に、必ずデータ ソースからデータを削除する必要があります。

    これが理想的な方法だと感じています。

  2. コールする場合reloadData、最初にコールする理由はまったくありませんdeleteRowsAtIndexPath

    これも正しいようです。

あいまいさを分析reloadDataしましたが、クラッシュするように書く deleteRowsAtIndexPathとうまくいきました。

誰かがその原因などについてこの問題を強調してくれることを願っています.

于 2014-08-27T10:57:24.380 に答える
0
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{

    if (editingStyle == UITableViewCellEditingStyleDelete)
    {
        [self.sql_ deleteSoundFileAudioTableWhereMainID:[[self.listOfSounds objectAtIndex:indexPath.row] objectForKey:@"main_id"]]; /// delete record from DB
        [self.listOfSounds removeObjectAtIndex:indexPath.row]; /// delete record from Array
        [self updateListofSoundsFile]; /// Custom method
    }
   [self.tblView reloadData]; 
}
于 2013-08-23T04:52:55.710 に答える