2010-05-11 33 views
5

我試圖去了解核心數據(我是iPhone開發的noob),爲了做到這一點,我試圖從fetchedresultscontroller和NSlog中獲取一個對象的名稱(對象的屬性) 。我試圖做這樣的:核心數據fetchedresultscontroller問題:什麼是「部分」?

NSArray *ar = [NSArray arrayWithArray:[fetchedResultsController sections]]; 
Task *t = [ar objectAtIndex:0]; 
NSLog(@"%@", t.taskName); 

然而,應用程序崩潰與此錯誤:應用程序崩潰與錯誤

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[_NSDefaultSectionInfo taskName]: unrecognized selector sent to instance 0x3d1f670'

因爲我已經學會了,你需要使用獲取對象的屬性爲此,但那些部分是爲了什麼?感謝您的幫助,如果這是一個非常愚蠢的問題,很抱歉。我查看了文檔,但仍然不明白。

回答

27

NSFetchedResultsController可以根據您指定的密鑰將您的對象分成多個部分。因此,例如,如果您的實體擁有category屬性,則可以將對象按category分組,並將其顯示在該類別的標題下。

每個UITableView(和每個NSFetchedResultsController)至少包含一個部分,所以即使您不使用此功能,仍需要處理部分。如果您check the documentation,您會看到sections屬性中的對象符合NSFetchedResultsSectionInfo協議,該協議的objects屬性包含該節中的對象。

有兩種方法可以得到一個實際的對象了NSFetchedResultsController的:

id <NSFetchedResultsSectionInfo> sectionInfo = [fetchedResultsController.sections objectAtIndex:0]; 
Task *task = [sectionInfo.objects objectAtIndex:0]; 

另外,要簡單得多,而且首選的方法是使用objectAtIndexPath:方法。

Task *task = [fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

這兩個樣本是等價的。 UIKit adds some methods to NSIndexPath可以更輕鬆地處理表格視圖和提取結果控制器。另外請注意,UITableViewDataSourceUITableViewDelegate方法都爲您提供了NSIndexPath對象,因此您通常只需將這些對象傳遞給objectAtIndexPath:以獲取該單元格的正確對象。

Apple還在iPhone上使用Core Data提供decent tutorial。它會回答你很多問題。不幸的是,它並沒有深入探究NSFetchedResultsController

+1

哇,非常感謝你,這是很棒的信息。 – Jake 2010-05-14 16:57:28