2012-09-01 81 views
7

我已經實現了一個使用UITableViewController/UITableView和Core Data的iPhone應用程序。此外,我使用NSFetchedResultsController來管理表格數據。這一切都非常簡單,並且效果很好。然後我決定當沒有找到/檢索到行時,我應該在UITableView中顯示一條消息。經過研究,似乎做到這一點的最好方法(也許是唯一的方法)是返回一個包含該消息的「虛擬」單元。但是,當我這樣做時,我從運行系統中得到一個令人厭惡的圖表,它抱怨(並且正確地)關於數據不一致:「無效的更新:無效的部分數量。表格視圖中包含的部分數量...」。下面是相關的代碼:從類似的問題在覈心數據UITableView中顯示「找不到行」消息

- (NSInteger) numberOfSectionsInTableView: (UITableView *)tableView 
{ 
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) return 1; 
    return [[self.fetchedResultsController sections] count]; 
} 

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

- (UITableViewCell *) tableView: (UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    if ([[self.fetchedResultsController fetchedObjects] count] == 0) { 
     UITableViewCell *cell = [[UITableViewCell alloc] init]; 
     cell.textLabel.text = @"No widgets found."; 
     return cell; 
    } 

    STCellView *cell = (STCellView *)[tableView dequeueReusableCellWithIdentifier: @"ShieldCell"]; 
    [self configureCell: cell atIndexPath: indexPath]; 
    return cell; 
} 

我已閱讀和迴應似乎我應該使用

insertRowsAtIndexPaths: withRowAnimation: 

的「虛擬」的信息行插入到我的表。但是,這也意味着在插入實際行時刪除「虛擬」行。我可以做到這一點,但似乎應該有一個更簡單的方法來實現這一點。我想要做的就是顯示一條消息,指出表中沒有行(很簡單?)。所以,我的問題是這樣的:有沒有辦法在UITableView中顯示消息,而不使用「虛擬」單元格方法,或者有沒有辦法說服UITableViewController/NSFetchResulsController這只是一個「虛擬」行,他們不應該得到因爲它在表格中不是一個真正的行(從我的角度來看),所以感到不安?

你可以提供任何幫助將是非常讚賞(我是一個新手,掙扎到iPhone發展,我想學習的最佳實踐)。謝謝。

+2

而不是破解tableview數據源以獲得預期的UI爲什麼不添加「找不到行」消息到tableview頭? – Rog

+0

@Rog有用的提示。 +1 –

+0

如果在表格視圖中只有一個部分,這是最好的方法。看到我的方法下面的多個部分 – Brett

回答

12

而不是破解tableview數據源來獲得預期的UI,你應該添加「找不到行」消息到tableview標題。

+0

這是最乾淨和最好的答案。非常感謝!! – user1092808

+0

我喜歡這樣的聲音。你是說你注意可用的行數,然後有條件地顯示/隱藏tableview標題?或者始終顯示標題並將其文本更改爲「找不到行」? –

+0

標題欄中的搜索欄不起作用 – Andy

1

我簡單的建議顯示一個空的消息是重新排列你的控制器是一個簡單的UIViewController(不是UITableViewController)。

UIViewControllerUITableView組成(所述控制器中的數據源和用於您的表的委託),並通過顯示在空白行消息的UILabel(或包含一個UILabel一個UIView)。

以這種方式,您可以根據檢索到的行控制表和標籤的可見性。

這種方法可能是艱苦的,但我認爲這是很好的避免黑客NSFetchResultsController和數據源。此外,你可以完全控制你的空信息的位置。

由於@Rog建議您也可以使用表格視圖標題來顯示該消息。根據你喜歡的。

希望它有幫助。

+0

這不是一個好的解決方案,因爲你不能使用UITableViewController內建的UIRefreshControl正確地繼承UIViewController。最好使用視圖控制器包含來嵌入表視圖控制器子類並處理容器視圖控制器中的空視圖。 – amb

+0

@amb這是一個可能的解決方案...操作系統沒有要求使用下拉菜單來刷新功能......在我的觀點中,遏制措施太多了。謝謝你的評論。 –

+0

嗯,你是絕對正確的,但是當你必須顯示一個空的表格視圖消息時,同時使用「UITableViewController」和「UIRefreshControl」是非常常見的。 – amb

1

的另一種方法,這是我以前使用時,可將「無行」實體在沒有行已在您的模型類被檢測到的部分,它處理的數據使用核心數據管理更新你更新。

有很多方法來實現這個例如將名稱/標題字段設置爲實體內的已知狀態消息或標誌。插入後,您可以檢測cellForRowAtIndexPath委託方法中的「無行」實體,並插入備用表格單元格以顯示該消息。

在刷新該部分的數據之前,只需刪除'no rows'實體。

+0

爲什麼選擇投票?我只是提供了一個工作解決方案來處理多個部分! – Brett

7

我做了如下viewDidLoad。

UILabel *label = [[UILabel alloc] init]; 
[label setTextColor:[UIColor lightGrayColor]]; 
[label setText:@"No widgets found."]; 
[label sizeToFit]; 
label.frame = CGRectMake((self.tableView.bounds.size.width - label.bounds.size.width)/2.0f, 
         (self.tableView.rowHeight - label.bounds.size.height)/2.0f, 
         label.bounds.size.width, 
         label.bounds.size.height); 
[self.tableView insertSubview:label atIndex:0]; 

在這種情況下,每個TableViewCells必須是不透明的以隱藏標籤。或者需要根據行數切換標籤的隱藏屬性。

相關問題