2010-12-03 208 views
5

看看Music.app(或iPod.app)。根專輯視圖有一個「所有歌曲」行。根Songs視圖有一個「Shuffle」行。根播放列表視圖具有「添加播放列表...」行。靜態數據與(可能的)Core Data數據混合在同一個UITableView中。我想知道蘋果如何實現這一目標。核心數據支持的非核心數據數據UITableView

我試過兩種不同的方法,都失敗了。像Music.app一樣,我的視圖在tableHeaderView中也有一個UISeachBar。我第一次嘗試跟蹤我有多少「靜態」行,並調整了提供給需要區段和行信息的各種UITableView和NSFetchedResultsController方法的indexPath。在我實現NSFetchedResultsControllerDelegate方法以允許創建,編輯和刪除之前,一切都很好。方法(和類似的)在我調整後的indexPaths上被絆倒了。缺省的indexPaths不能按原樣工作。

我的第二次嘗試是在我的主UITableView的tableHeaderView中嵌套另一個UITableView以用於靜態行(並將UISeachBar放置在它自己的tableHeaderView中)。這種方法甚至沒有進入可編輯階段。 UISearchBar最終被根UITableView的sectionIndex洗刷程序重疊,並且在滾動短列表時不再在UINavigationBar後面滑動。

因此,我不是在診斷我的具體問題,而是在就蘋果如何實現這一目標提出建議。他們是否可以一次獲取數據,將其緩存在NSArray中,並構建包含靜態數據行和核心數據行的嵌套NSArray的節和行?

+0

當然,只要你公開發布的東西......第二種方法是重新設置爲一個UIView住房UISeachBar和靜態的UITableView的tableHeaderView運行。我們會看到我能得到多少。建議仍然歡迎。 – 2010-12-03 03:48:38

回答

3

最近我遇到了同樣的問題。我想在表格的頂部添加一行以及一些靜態內容(所有歌曲)。我通過簡單地插入我自己的部分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,然後將其不透明地傳遞給期望調整後的indexPaths的方法。你能否用你必須調整索引路徑進行編輯的所有方法名稱來更新答案?也許我錯過了一兩個。 – 2010-12-03 13:23:15

1

這就是我要做的(構建自己的緩存)。應用程序與iPod.app中的皺紋似乎是NSFetchedResultsControllerDelegate位。我不認爲iPod.app提供了特定的界面,對吧?所以,不需要自動創建/編輯/重新排序支持。

正如你自己所說的那樣,它增加了一點,那就是你的indexPath需要停止工作。

我想你只需要手動滾動這個。這似乎是Apple的API的典型特徵:一旦您偏離了簡單的用例,它們的便利功能就會開始遇到問題。你應該在bugreport中提出bug,告訴你如何工作 - 希望他們能夠在將來提出一些事情,因爲這看起來像是其他人可能遇到的用例。另外,我不知道你是否需要一直到在NSArrays中存儲,但是如果你這樣做,分頁你的提取,並只緩存RAM中的必要條件,如果該集合可以變得非常大。

我有一個簡單的照片應用程序,我正在處理和緩存支持有效像光標一樣的東西。目前,我最終還是將所有內容都保存在內存中,但是細節隱藏在一個界面後面,我可以很容易地重構這些界面。該接口看起來像一個數組,但自動知道要去網絡獲取更多結果集,將它們緩存到CoreData,並混合來自不同頁面的結果。所以,我的UITableView委託只做[cursor objectAtIndex:blah],魔法隱藏在幕後。這是非常可行的。

Sujal