2

私はここで最初のiPhoneアプリ(基本的なやることリストアプリ)に取り組んでおり、テーブルビューにNSFetchResultsControllerを追加しました。行のセクションが2つあり、行を追加するのに問題はありません。目標のcompleted属性がtrueであるかどうかで並べ替えられます。trueの場合は、下部のセクションに移動し、取り消し線が引かれます。

また、上部の行を右にスワイプすると、目標の完全な属性がtrueに変更され、下部のセクションに移動します。

  RegimenGoal *goal = [_fetchedResultsController objectAtIndexPath:swipedIndexPath];
  goal.completed = [NSNumber numberWithBool:YES];

  [context save:&error];

これが私のビューコントローラコードです。

何らかの理由で、これは私が作成したばかりの目標にのみ機能し、追加した既存の目標には機能しません。デバッグを行った後、NSFetchedResultsChangeMoveが実行されていないことに気付きました。代わりに、新しいものではない既存の目標に対してこのアクションを実行しているときは常にNSFetchedResultsChangeUpdateが実行されます。

Appleのドキュメントでもこれに出くわしました。 「移動したオブジェクトが更新されたと報告されることがあります」。そして、完了した属性がtrueであるかどうかを確認するだけで、そこにリストされている回避策を試しました。

そして、それを行うと、newIndexPathは新しいものではないことがわかります。これは単に古いindexPathであり、それは私を困惑させています...なぜこれが起こっているのかについて何か考えはありますか?

4

1 に答える 1

1

フェッチされた結果コントローラーの作成でエラーが発生しました。を指定して結果をセクションにグループ化する場合はsectionNameKeyPath:@"completed"、同じキーを使用して最初のソート記述子を追加する必要があります。

NSSortDescriptor *completeSort = [[NSSortDescriptor alloc] initWithKey:@"completed" ascending:YES];
NSSortDescriptor *daySort = [[NSSortDescriptor alloc] initWithKey:@"dateCreated" ascending:YES];
[dayRequest setSortDescriptors:[NSArray arrayWithObjects:completeSort, daySort, nil]];

もう一つの問題はtableView:cellForRowAtIndexPath:

[self configureCell:cell atIndexPath:indexPath];
[cell formatCell:indexPath.section];

ここでは、セクション 0 には のすべてのアイテムが含まれcompleted = NO、セクション 1 には のすべてのアイテムが含まれていると仮定しcompleted = YESます。ただし、すべての項目が完了している場合は、完了したすべての項目を含む 1 つのセクション (セクション 0) しかありません。indexPath.sectionしたがって、への引数として使用することはできませんformatCell。代わりにの値を使用する必要がありますgoal.completed。たとえば、formatCell呼び出しをconfigureCell:atIndexPath:メソッドに移動できます。

- (void)configureCell:(RegimenCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    RegimenGoal *goal = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.label.text = goal.text;
    [cell formatCell:goal.completed.intValue];
}

reuseIdentifierそして今、表のセルをセクションと行番号に依存させることはあまり意味がありません。交換するだけでいいと思います

NSString *CellIdentifier = [NSString stringWithFormat:@"%d-%d", indexPath.row, indexPath.section];

固定文字列による

NSString *CellIdentifier = @"YourCellIdentifer";

setNavTitleメソッドにも同様の問題があります。

int goalsCount = [_tableView numberOfRowsInSection:0];
int completedCount = [_tableView numberOfRowsInSection:1];

繰り返しますが、すべての目標が達成された場合、それらはすべてセクション 0 にあり、セクション 1 はありません。その場合、現在のコードでは「(100%)」ではなく「(0%)」が表示されます。

その他の備考:

  • 「移動されたオブジェクトが更新されたと報告されることがある」回避策は、ここでは必要ないようです。
  • NSFetchedResultsChangeUpdateイベントの場合は、 または を呼び出すことができ[self configureCell:...]ます[[_tableView reloadRowsAtIndexPaths:...]。両方を呼び出す必要はありません。
  • インスタンス変数は、要求に応じてフェッチ済み結果コントローラー (FRC) を作成するメソッドで_fetchedResultsControllerのみ使用する必要があります。fetchedResultsController他のすべての場所ではself.fetchedResultsController、必要に応じて FRC が確実に作成されるようにする必要があります。
于 2012-12-22T10:26:37.273 に答える