1

這裏是我的數據模型: Datamodel http://s1.directupload.net/images/131007/ud8fqkra.png核心 - 數據NSFetchedResultsController一對多關係

我充滿了數據庫中的數據。

現在我想在tableview中顯示它。 首先,我想選擇'天'屬性的一天,然後得到它的教訓。 我想在標題中顯示屬性「結束」和「開始」(-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section

然後我想在右側部分顯示課程數據。我怎樣才能做到這一點與NSFetchedResultsController?

我已經建立了一個基本的代碼:

NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Lessons class])]; 

NSSortDescriptor* sortGroup = [NSSortDescriptor sortDescriptorWithKey:@"lesson" ascending:YES]; 
fetch.sortDescriptors = @[sortGroup]; 

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 

NSError* error; 
[controller performFetch:&error]; 
if (error) { 
    NSLog(@"Error: %@", error); 
    abort(); 
} 

編輯:

這裏是故事板:

Storyboard

UPDATE

這裏是我的代碼:

TableView.m(重要的方法)

-(id)init 
{ 
    self = [super init]; 
    if (self) { 
     NSLog(@"%s",__PRETTY_FUNCTION__); 
     self.del = [[UIApplication sharedApplication] delegate]; 
     self.managedObjectContext = self.del.managedObjectContext; 

     NSFetchRequest* fetch = [NSFetchRequest fetchRequestWithEntityName:@"Lessons"]; 

     NSString *theSelectedDay = @"Mi"; 

     NSPredicate *pred = [NSPredicate predicateWithFormat:@"lessonToDay.day == %@", theSelectedDay]; 
     fetch.predicate = pred; 
     NSSortDescriptor *sortTime = [NSSortDescriptor sortDescriptorWithKey:@"lessonToTime.start" ascending:YES]; 
     //NSSortDescriptor *sortGroup = [NSSortDescriptor sortDescriptorWithKey:@"lesson" ascending:YES]; 
     fetch.sortDescriptors = @[sortTime]; 

     self.controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch 
                   managedObjectContext:self.managedObjectContext 
                   sectionNameKeyPath:@"lessonToTime.start" 
                     cacheName:nil]; 
    } 
    return self; 
} 

#pragma mark - Table view data source 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    static NSString *CellIdentifier = @"Cell"; 


    // Configure the cell... 
    //UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 


    Lessons *lesson = [self.controller objectAtIndexPath:indexPath]; 
    cell.textLabel.text = lesson.lesson; 


    return cell; 
} 

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 

    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section]; 
    // This is the first lesson in this section: 
    Lessons *lesson = [sectionInfo objects][0]; 

    //For testing I changed the type of 'start' and 'end' to string 
    NSLog(@"start: %@",lesson.lessonToTime.start); 
    NSLog(@"end: %@", lesson.lessonToTime.end); 

    NSString *title = [NSString stringWithFormat:@"%@-%@", 
         lesson.lessonToTime.start, 
         lesson.lessonToTime.end]; 
    return title; 
} 

結果: Result

+0

一般情況下,你使用'sectionNameKeyPath :'參數將表視圖分組爲部分。但是你的要求並不明確:如果A是9-11,B是9-10,C是10-11,那該怎麼辦?這些應該如何分組,以及部分標題應該是什麼? –

+0

@MartinR時代已經到來。它總是這樣:9-10 =>課A,課B; 10-11 =>課程C,課程D,課程E,課程F ...我希望現在很清楚。 – iCode

+0

「天」實體是否描述一天,例如星期一或星期二?我只是想知道複數形式。 –

回答

2

首先,你必須添加僅顯示選定日期的教訓斷言:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"lessonToDay.day == %@", theSelectedDay]; 
fetch.predicate = pred; 

來分組表視圖段,你必須設置的牽強的sectionNameKeyPath:參數 結果控制器,例如到@"lessonToTime.start"。這會將具有相同開始時間的所有課程分組爲 。 (根據我的理解你的評論,具有相同開始時間的課程也有相同的結束時間,所以這應該是足夠的。) 相同的密鑰路徑必須作爲第一個排序描述:

NSSortDescriptor *sortTime = [NSSortDescriptor sortDescriptorWithKey:@"lessonToTime.start" ascending:YES]; 
NSSortDescriptor *sortGroup = [NSSortDescriptor sortDescriptorWithKey:@"lesson" ascending:YES]; 
fetch.sortDescriptors = @[sortTime, sortGroup]; 

NSFetchedResultsController *controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetch 
      managedObjectContext:self.managedObjectContext 
      sectionNameKeyPath:@"lessonToTime.start" 
      cacheName:nil]; 

要根據您的需要顯示的節頭,你必須覆蓋titleForHeaderInSection:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section]; 
    // This is the first lesson in this section: 
    Lesson *lesson = [sectionInfo objects][0]; 
    // Now build some title from lesson.lessonToTime.start and lesson.lessonToTime.end: 
    NSString *title = ...; 
    return title; 
} 
+0

它無法正常工作。我在UPDATE部分發布了我的代碼。我犯了什麼錯誤? – iCode

+0

你已經實現了'numberOfSectionsInTableView:'和'numberOfRowsInSection:'完全錯誤的。返回一個固定值'1'沒有任何意義。 NSFetchedResultsController文檔包含示例代碼,瞭解如何正確實現數據源方法。 - 也許閱讀http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller這樣的教程。 –

+0

我知道像'1'這樣的固定值是錯誤的。但爲了測試它,我已經這樣做了。當我在'numberOfSectionsInTableView:'return self.controller.section.count'中實現它時,它有0個部分。所以訪問課程的語法是錯誤的。 (使用'NSFetchedResultsController') – iCode

1

您可以有兩個視圖控制器做到這一點:

  • DaysViewController - 在這裏你顯示所有天。當用戶選擇該小區,你獲得與小區相關的一天,它傳遞給第二個視圖控制器,
  • LessonsViewController - 在這裏你建立你的NSFetchRequest的時候使用傳遞的對象predicate

UPDATE:我的答案不再正確,因爲問題的描述已經改變。

+0

THX爲您的答案。我編輯了我的問題,添加了Storyboard。在頂部,用戶可以選擇一天。 – iCode