1

編集/削除またはスワイプ-削除ジェスチャでアイテムを削除した後、テーブルが更新されません。[編集/削除]を実行しても、[削除]ボタンが消えません。それは押された/スタックした状態でそこにとどまります。次に[完了]をクリックすると、[削除]ボタンが消えます。このスクリーンショットは、この投稿の下部に添付されています。

私のnumberOfRowsInSectionコードは、アプリの起動時に実行されますが、アイテムの削除後には実行されません。

UITableViewControllerを使用しています。私の.hファイルの定義:

@interface BNVFavoritesTableViewController : UITableViewController <UITableViewDelegate, UITableViewDataSource>{    
  BNVAppDelegate *appDelegate;    
  IBOutlet UITableView *myTable;
}

@property (retain, nonatomic) IBOutlet UITableView *myTable;
@end

これが私の.mファイルからの関連コードです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"number of rows:\t%d", [appDelegate.favoritesArray count]);
    return [appDelegate.favoritesArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    //Get the object from the array.
    BNVFavorite *favoriteObj = [appDelegate.favoritesArray objectAtIndex:indexPath.row];

    //Set the name.
    cell.textLabel.text = favoriteObj.name;

    // Set up the cell
    return cell;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete){
        NSLog(@"before delete\t%d", [appDelegate.favoritesArray count]);        
        BNVFavorite *selectedObject = [appDelegate.favoritesArray objectAtIndex:indexPath.row];
        NSString *selectedName =  selectedObject.name;
        // delete from sqlite database
        [appDelegate removeFavoriteFromDB:selectedName];
        // delete from memory array
        [appDelegate.favoritesArray removeObjectAtIndex:indexPath.row];
        // delete in user interface
        [myTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        NSLog(@"after delete\t%d", [appDelegate.favoritesArray count]);

    }

}

削除すると、ログに「削除前」と「削除後」のメッセージが表示されますが、「行数」メッセージは表示されません。

テーブルビューのデータソースとデリゲートアウトレットは、TableViewControllerクラスに接続されています。ViewDidLoadメソッドでもこれを試してみましたが、違いはありませんでした。[myTable reloadData];私の最後にaを強制するcommitEditingStyleことも助けにはなりません。

最後に、これがその「スタック」削除ボタンのスクリーンショットです。 http://i.stack.imgur.com/ukUu0.png

数回クリックすると、NSRangeException / out of boundsエラーが発生し、fromのコードcommitEditingStyleが実行されたことを示します。

4

3 に答える 3

2

何時間も検索した後、問題が見つかりました。ストーリーボードのテーブルビューからコントローラー クラスの myTable への参照アウトレットが存在しなくなったことが判明しました。うっかり外してしまったのでしょう。myTableに置き換えたときにコードが機能し始めたことに気づいたとき、私はそれを知りましたself.tableView

于 2012-11-26T21:26:27.320 に答える
0

との間に削除アニメーションを追加する必要がありbeginUpdatesますendUpdates

[myTable beginUpdates];
[myTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[myTable endUpdates];
于 2012-11-26T14:12:28.337 に答える
0

テーブルの接続インスペクターで接続を確認してください。

または正しく接続されている場合は、レコードを削除した後にテーブルをリロードします

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    // If row is deleted, remove it from the list.
    if (editingStyle == UITableViewCellEditingStyleDelete){
        NSLog(@"before delete\t%d", [appDelegate.favoritesArray count]);        
        BNVFavorite *selectedObject = [appDelegate.favoritesArray objectAtIndex:indexPath.row];
        NSString *selectedName =  selectedObject.name;
        // delete from sqlite database
        [appDelegate removeFavoriteFromDB:selectedName];
        // delete from memory array
        [appDelegate.favoritesArray removeObjectAtIndex:indexPath.row];
        // delete in user interface
        [myTable deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        NSLog(@"after delete\t%d", [appDelegate.favoritesArray count]);
        [myTable reloadData];
    }

}
于 2012-11-26T15:03:09.157 に答える