2

私はスライド可能なtableViewセルで、セルには行を削除するボタンがあります。行を削除するメソッド内にこのコードがあります。行の内容は DataSource から正しく削除されますが、tableView の非表示と再読み込みに問題があります。これが私のコードです:

- (void)deleteElementAtIndexPath:(NSIndexPath *)indexPath {
    [dateTableView beginUpdates];

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];

    listTitles = [[NSMutableArray alloc] init];

    listTitles = [[user objectForKey:@"listTitles"] mutableCopy];

    [listTitles removeObjectAtIndex:indexPath.row];

    [user setObject:listTitles forKey:@"listTitles"];
    [user synchronize];

    [dateTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [dateTableView endUpdates];
    [dateTableView reloadData];
}

私のクラスにはデリゲートと dataSource プロトコルがあります。これも私のデリゲートメソッドです:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    NSLog(@"reloading...numberofsection");
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    NSLog(@"reloading...numberofrowsinsection");

    return [listTitles count];
}
4

3 に答える 3

1

これらの行を取り出してください -

listTitles = [[NSMutableArray alloc] init];

listTitles = [[user objectForKey:@"listTitles"] mutableCopy];

[dateTableView reloadData];

そして、IBOUlets が接続されていることを完全に確認してください。dateTableViewカスタム UIViewController クラスを使用していることを示す、という名前の tableView インスタンスを使用していることがわかります。これに Interface Builder を使用した場合は、アウトレットがテーブルに接続されていることを確認する必要があります。そうでない場合、どこかで dateTableView を呼び出すことは、メッセージを nil に送信するようなものです。

于 2013-08-08T19:40:08.983 に答える
0

次の行で変数をオーバーライドしているため、NSMutableArray の割り当ては役に立ちません。beginUpdates と endUpdates を呼び出す場合、reloadData も必要ありません。

引数として渡す indexPath に正しいセクションが含まれていることを確認してください。テーブルビューが間違ったセクションで行を削除しようとしている可能性があります。セクションが正しい場合は、UITableViewDataSource の実装を確認する必要があります。

それを確認する

listTitles = [[user objectForKey:@"listTitles"] mutableCopy];

NIL を返しません。そうしないと、このオブジェクトに対して呼び出したすべての新しいメソッドが無効になります。numberOfRowsInSection: から返されたセル数も記録する必要があります。ちなみに、よりクリーンな実装は次のようになります。

@property (strong, nonatomic) NSMutableArray * listTitles;
@synthesize listTitles;

- (void)deleteElementAtIndexPath:(NSIndexPath *)indexPath {
    [dateTableView beginUpdates];

    [self.listTitles removeObjectAtIndex:indexPath.row];

    NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
    [user setObject:self.listTitles forKey:@"listTitles"];
    [user synchronize];

    [dateTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
    [dateTableView endUpdates];
}

コンストラクター (またはコントローラーの場合は viewDidLoad) で、次の操作を行います。

self.listTitles = [[[NSUserDefaults standardUserDefaults] objectForKey:@"listTitles"] mutableCopy];
if (self.listTitles == nil) {
    self.listTitles = [[NSMutableArray alloc] init];
}
于 2013-08-08T19:37:43.913 に答える