2010-12-03 8 views
5

Music.app(またはiPod.app)を見てください。ルートアルバムビューには「すべての曲」行があります。ルートのソングビューには「シャッフル」の行があります。ルートプレイリストビューには、「プレイリストを追加...」行があります。静的なデータは、同じUITableViewで(おそらく)コアデータデータと混在しています。私はAppleがどのようにこれを達成したのか疑問に思います。コアデータバックアップUITableViewの非コアデータデータ

私は2つの異なる方法を試みましたが、どちらも失敗しました。 Music.appと同様に、私のビューもtableHeaderViewにUISeachBarを持っています。私の最初の試みは、セクションと行の情報を必要とするさまざまなUITableViewメソッドとNSFetchedResultsControllerメソッドに提供されたindexPathを、いくつの "静的な"行に収めて調整したかを追跡しました。作成、編集、削除を可能にするNSFetchedResultsControllerDelegateメソッドを実装するまで、すべてがうまくいっていました。 insertRowsAtIndexPaths:withRowAnimation:メソッド(およびそれに類するもの)は、私の調整されたindexPathsでトリップされます。デフォルトのindexPathsはそのまま動作しません。

私の2番目の試みは、プライマリUITableViewのtableHeaderViewに別のUITableViewを入れ子にして、静的な行に使用する(そして自身のtableHeaderViewにUISeachBarを格納する)ことでした。このアプローチは編集可能な段階にさえしていませんでした。 UISearchBarは、ルートのUITableViewのsectionIndexスクラバーによってオーバーラップしてしまい、短いリストをスクロールするときにUINavigationBarの後ろにスライドしなくなりました。

私の特定の問題を診断するのではなく、Appleがこれをどのように達成するかについての提案を求めています。 NSArrayでデータをキャッシュし、静的データ行とコアデータ行の両方を含むセクションと行のネストNSArrayを構築することができますか?

+0

は、できるだけ早くあなたが公に何かを投稿して...第2のアプローチは、バックのUIViewハウジングUISeachBarと静的のUITableViewに設定tableHeaderViewで実行中です。私はこれとどのくらいの距離を得るのかを見ていきます。提案はまだ歓迎です。 –

答えて

3

最近同じ問題が発生しました。テーブルの一番上にいくつかの静的コンテンツ(All Songs)を含む行を追加したかったのです。セクション0のために私自身のセクションを挿入してから、コアデータセクションをインクリメントするだけで問題は解決しました。 0は1になり、1は2になります。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return [_fetchedResultsController sections] + 1; 
} 

- (NSInteger)tableView:(UITableView *)tv numberOfRowsInSection:(NSInteger)section { 
    if(section == 0) { 
     return 1; 
    } 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[_fetchedResultsController sections] objectAtIndex:section-1]; 
    return [sectionInfo numberOfObjects]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // All Charts 
    if(indexPath.section == 0 && indexPath.row == 0) { 
     // Set up the custom cell 
    } 
    // Sets 
    else { 
     // Set up the core data cells 
    } 
} 

残りは、行などを削除するときのindexPathセクションの調整の問題です。

+0

これはまさに私が最初の試みで行ったことですが、未調整のindexPathを必要とするロジックの作成、編集、削除にはいくつかの方法があるようですが、調整されたindexPathを必要とするメソッドに不透明に渡されます。編集のためにインデックスパスを調整しなければならなかったすべてのメソッド名で答えを更新できますか?たぶん私は1つか2つ不足しています。 –

+0

私はそれを理解したと思う。私のテーブルビューは、他のビューから渡されたNSFetchedResultsControllerまたはプリフェッチされたNSManagedObjectsの配列からそのデータを引き出すことができるので、アダプタパターンを使用してインタフェースを正規化していました。これらのアダプタメソッドの1つが、調整されていない値を返すべきときに調整していたことが分かります。 –

1

それは私がやることです(自分のキャッシュを構築する)。あなたのアプリとiPod.appとのシワは、NSFetchedResultsControllerDelegateビットのようです。 iPod.appがその特定のインターフェースを提供しているとは思いませんか?したがって、自動作成/編集/並べ替えのサポートはありません。

あなた自身が述べたように、それによって、indexPathの動作が停止する原因となりました。

私はあなたが手でこれをロールバックする必要があると思います。これはAppleのAPIによく見られるようです。単純なユースケースから逸脱すると、便利さの機能が問題になり始めるからです。バグレポートにバグを報告して、これをどのように動作させるかを提案してください。他の人が遭遇する可能性があるユースケースのように見えるので、将来的に何かが出てくるはずです。

また、NSArraysに格納する必要があるかどうかはわかりませんが、そうした場合はフェッチをページアウトし、セットが本当に大きくなる場合はRAMに必要なものだけキャッシュします。

私は、私が取り組んでいる単純な写真アプリを持っており、キャッシュは効果的にカーソルのように機能するものに支えられています。現時点では、私もすべてをメモリに保存してしまいますが、詳細はインターフェイスの後ろに隠れているため、リファクタリングが非常に簡単です。インターフェイスは配列のように見えますが、追加の結果セットをフェッチしてCoreDataにキャッシュし、別のページの結果をミックスするためにネットワークに行くことを自動的に知っています。だから、私のUITableViewデリゲートは[cursor objectAtIndex:blah]を実行し、魔法は隠されたままになります。それは非常に実行可能です。もちろん

Sujal

関連する問題