1

私は最近、Bird Watching と呼ばれるテーブル ビューに関する Apple チュートリアルを完了しましたが、これはうまくいきました。ただし、編集ボタンを追加してさらに進めようとしているところに問題があるようです。

以下は、私のテーブルを作成するために MasterViewController が使用するコードです。これはうまくいきます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath (NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"BirdSightingCell";

static NSDateFormatter *formatter = nil;
if(formatter == nil){
    formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterMediumStyle];
}
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

BirdSighting *sightingAtIndex = [self.dataController objectInListAtIndex:indexPath.row];
[[cell textLabel]setText:sightingAtIndex.name];
[[cell detailTextLabel]setText:[formatter stringFromDate:(NSDate *)sightingAtIndex.date]];
return cell;
}

編集ボタンを機能させるために、このコードのいくつかを使用してみました。以下は私が作成したものです。これは機能せず、修正方法がわかりません。

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


if (editingStyle == UITableViewCellEditingStyleDelete) {
    BirdSighting *sightingAtIndex = [self.dataController removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
} else if (editingStyle == UITableViewCellEditingStyleInsert) {
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view.
}
}

エラー メッセージの 1 つに、「BirdSightingDataController の可視の @interface がセレクタ removeObjectAtIndex を宣言していません。

4

1 に答える 1

2

Apple Web サイトのBird Watchingチュートリアルを調べて、あなたが話していることとオブジェクトがどのクラスのインスタンスであるかを正確に知りました。

tableView:commitEditingStyle:forRowAtIndexPath:メソッドでは、特定のオブジェクトを削除しようとします。オブジェクトを削除するときは、ビュー (この場合はテーブル ビュー) とモデル オブジェクト (この場合はデータ コントローラー) の両方から削除されていることを確認する必要があります。次のように、テーブル ビューから行を削除しました。

[tableView deleteRowsAtIndexPaths:@[indexPath]withRowAnimation:UITableViewRowAnimationFade];

この部分は良さそうです。ただし、次のコード行を使用して、データ コントローラーからオブジェクトを削除しようとします。

BirdSighting *sightingAtIndex = [self.dataController removeObjectAtIndex:indexPath.row];

removeObjectAtIndex:メソッドを に送信しましたself.dataController。メソッドはのremoveObjectAtIndex:インスタンスにのみ送信できますNSMutableArray。データ コントローラーは のインスタンスですがBirdSightingDataController、 ではありませんNSMutableArray。したがって、removeObjectAtIndex:メソッドをに送信しようとするとself.dataController、エラーが発生します。

データ コントローラー配列の特定のインデックスにあるオブジェクトにアクセスするには、次のobjectInListAtIndex:ようにメソッドを宣言して実装します。

- (BirdSighting *)objectInListAtIndex:(NSUInteger)theIndex {
    return [self.masterBirdSightingList objectAtIndex:theIndex];
}

データ コントローラー配列の特定のインデックスにあるオブジェクトを削除したい場合はremoveObjectInListAtIndex:BirdSightingDataControllerヘッダー ファイルでも同様にメソッドを宣言できます。その後、次のように実装できます。

- (void)removeObjectInListAtIndex:(NSUInteger)theIndex {
    [self.masterBirdSightingList removeObjectAtIndex:theIndex];
}

このメソッドは配列からオブジェクトを削除するだけなので、何も返さないことに注意してください。ヘッダーと実装ファイルの両方で- (void)代わりに使用していることを確認してください。- (BirdSighting *)

メソッドをデータ コントローラーに送信する代わりに、removeObjectAtIndex:次のようにデータ コントローラーから (ユーザーが削除した) オブジェクトを簡単に削除できます。

[self.dataController removeObjectInListAtIndex:indexPath.row];
于 2012-10-20T00:25:53.683 に答える