1

これらのさまざまな設定を試しているので、1つのアプリ内に2つのコントローラーがあります。

1つはUITableViewControllerで、私が理解しているように、デリゲートとデータソースはスーパークラスから取得されます。

その理論に従って、UITableViewを含むUIViewControllerもあり、ヘッダーファイルでデータソースとデリゲートを宣言しました。

ここまでは順調ですね:-)

今、これは私が得られないビットです:

実装ファイルでは、tableViewポインターを使用してデータをリンクできますが、Core Dataを使用しており、特に次のコードがあります。

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
  {   
  [self.tableView beginUpdates];
  }

これと他の5つの状況では、セットアップしないとUIViewControllerでエラーが発生します。

IBOutlet UITableView *tableView;

もちろんそれは合成されます:-)

しかし、このtableViewを宣言すると、次のような行にダブルアップの警告が表示されます。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"];
[self configureCell:cell atIndexPath:indexPath];
return cell;
}

これは、tableViewも宣言しているためです。

だから私は2つの質問があります:

1)UITableViewDatasourceとDelegateを設定したのに、なぜIBOutletを設定する必要があるのですか?

2)UITableViewCellに別のポインター名(tableView2など)を付けた場合、データの編集時に変更を表示できず、アプリを再起動した後にのみ結果を表示できるのはなぜですか?

UITableViewControllerであるMasterViewControllerには、このオプションがありません。

乾杯ジェフ

---画像の追加----

ここに画像の説明を入力してください

ここに画像の説明を入力してください


編集モードに入るには、viewDidLoadにこのコードがあります

self.navigationItem.leftBarButtonItem = self.editButtonItem;

そして、私はこのコードを使用して、実行する必要があることを実行します。

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

{if(editingStyle == UITableViewCellEditingStyleDelete){NSManagedObjectContext * context = [self.fetchedResultsController managedObjectContext]; [context deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];

    NSError *error = nil;
    if (![context save:&error]) {
        // Replace this implementation with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
}   
}

+オプションが機能するようになりましたが、アプリを再起動した後にのみ結果が表示されます。スワイプして削除することはできますが、アプリの同じインスタンス内でライブアニメーションを実行することはできません。

4

1 に答える 1

1

tableViewというプロパティを宣言し、おそらく同じ名前で合成しただけです。

UITableViewControllerまた、tableViewというプロパティもありますが、おそらく_tableView、デフォルトのtableviewデータソースメソッドとデリゲートメソッドtableViewが、メソッドのスコープ内でインスタンス変数と衝突しているという引数を渡すため、バッキングivarは別の名前になります。

その方法の中で、どういうtableView意味ですか?渡された引数、またはあなたのivar?

あなたの特定の質問に答えて:

  1. ビューコントローラがテーブルビューと通信する必要がある場合(更新を開始するように指示する場合など)、これらのインスタンス用のアウトレットが必要です。データソースとデリゲートの接続は、テーブルビューがView Controllerと通信する必要がある場合(セルを要求する場合など)に使用されます。

  2. ここで何を求めているのかわかりません。テーブルビューのアウトレットを好きなように呼び出すことができますが、メッセージを送信するすべてのものを変更する必要もありますself.tableView。便宜のために、私は次のようにプロパティを合成します:

    @synthesize tableView = _tableview;
    

    tableViewこれにより、そもそも存在するというivarが防止されます。私はあなたがivarを宣言しておらず、プロパティをIBOutletとして宣言しているだけだと思いますか?:

    @property (nonatomic) IBOutlet UITableView *tableView;
    
于 2012-04-17T09:16:26.210 に答える