4

セクション ヘッダーとセクション インデックスを設定するセクションを作成する結果を使用して、NSFetchedResultsController を使用して UITableViewController を設定しています。次の方法を使用して、セクション インデックスを設定しています。

- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView {
    return [fetchedResultsController_ sectionIndexTitles];
}

そして今、私は問題に遭遇しました。NSFetchedResultsController に関連付けられた NSManagedObjectContext に新しい要素を追加すると、新しい要素が保存され、UITableView のセルとして適切に表示されます... 1 つのことを除いて。新しい要素が新しいセクションを作成する場合、UINavigationController のスタックをポップして UITableViewController をリロードしない限り、新しいセクション インデックスは右側の余白に表示されません。

私はNSFetchedResultsControllerDelegateのインターフェースに準拠し、手動で呼び出します

[self.tableView reloadSectionIndexTitles];

これら両方のデリゲート メソッドの最後に:

controller:didChangeSection... 
controller:didChangeObject...

メソッドの実行をデバッグしてトレースし、リロード呼び出しが呼び出されたことを確認できますが、UITableView のセクション インデックスにはセクションの変更が反映されません。

ここでも、データが表示されます。新しいセクションは UITableView で物理的に表示 (または削除) されますが、セクション インデックスは更新されません。

何か不足していますか?

4

5 に答える 5

7

これは私たち全員が抱えているバグのようです。かなり厄介なコードの多行ソリューションのように見えるものについては、 http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.htmlを参照してください。私はこれで行きました:

- (void)viewWillAppear:(BOOL)animated; {
  // This is a dumb hack required by this bug: http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html
  [self.tableView reloadData];
}

非効率的かもしれませんが、大量のデータがない限り、おそらく害はありません。そして、それはたった1行のコードです。したがって、アップルがバグを修正すると、簡単に取り除くことができます。

于 2010-01-06T22:24:18.047 に答える
1

受け入れられた回答と遅延のあるAlexReynoldsの回答を組み合わせるにはreloadData、アニメーションの継続時間に対応する遅延、つまり0.4秒または0.3秒で呼び出します。

私の場合、遅延メソッド呼び出しをcontroller:didChangeSection:atIndex:forChangeType:(これはCoreDataアプリです)に固定します。

セクションが追加または削除されると、結果はセルの標準アニメーションになり、データが再ロードされるときにインデックスが更新されます。

それは醜くて私をうんざりさせます、しかし私は結果で大丈夫です。また、Appleにバグを提出しました(#8589547)。

于 2010-10-25T15:26:13.040 に答える
1

質問はすでに2か月前ですが、今日同じ問題に遭遇しました。まったく機能していないように見える-reloadSectionIndexTitlesので、次のいずれかが機能する可能性のあるハックをいくつか試しました。

@implementation UITableView (JKAdditions)

- (UIView *)indexView {
    Class indexClass = NSClassFromString(@"UITableViewIndex");
    for(UIView *subview in self.subviews){
        if([subview isKindOfClass:indexClass]) return subview;
    }
    return nil;
}

- (void)reloadSectionIndexTitles {
    UIView *indexView = [self indexView];
    [indexView performSelector:@selector(setTitles:) withObject:[self.dataSource sectionIndexTitlesForTableView:self]];
    [indexView setNeedsDisplay];
}

@end

このハッキングが原因で Apple があなたのアプリを拒否するかどうかはわかりませんが、私にとってはそれが唯一の選択肢のようです。あらゆる種類のアニメーションの問題に対処しなければならないため、tableView 全体を再読み込みすることは私が望んでいることではありません。

これが同じ問題を抱えている人の助けになることを願っています!

于 2010-03-28T21:40:07.443 に答える
0

私が行うもう 1 つのこと (それは私にとってはうまくいきますが、あなたにとってうまくいくことを保証することはできません) は、非常に短い遅延の後にセレクターを実行することです。

[self performSelector:(@selector(refreshSectionIndex)) withObject:nil afterDelay:0.2];

// ...

- (void) refreshSectionIndex {
    [self.tableView reloadSectionIndexTitles];
}    

コア データNSFetchedResultsController、特にデリゲート テーブル ビューの更新がフェッチされたデータと同期しなくなり、アプリケーションがクラッシュするなど、非常にバグが多いようです。Apple が 4.0 SDK でこれらのフレームワークのバグを修正するための措置を講じていることを心から願っています。かなりイライラします。

于 2010-01-06T22:36:31.637 に答える
0

-controllerDidChangeContent:の最後、 の後のどこかに置いてみてください[self.tableView endUpdates]

于 2010-01-03T23:17:28.893 に答える