2013-08-21 3 views
9

У меня есть объект, отображаемый в виде таблицы только в одном разделе. Предприятие имеет два атрибута: workoutName и trainingLevel. Оба имеют строковый тип. Уровень подготовки состоит из 3 типов: 1, 2, 3. (trainingLevel = (Integer 16 или String Type? Что было бы идеальным?) Я хотел бы разбить таблицу на три раздела, каждый раздел содержит записи для соответствующего уровня обучения .?разделы iOS UITableView с fetchedResultsController confusion

Как это сделать код настоящее время я использую ниже:

- (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 self.workoutType.workouts.count; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = 
    [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
            reuseIdentifier:CellIdentifier]; 
     cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 
    } 


    WorkoutSet *workoutSet = [self.fetchedResultsController objectAtIndexPath:indexPath]; 


    cell.textLabel.text = workoutSet.workoutName; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"(%d)", workoutSet.days.count];  
} 

-(void)fetchWorkoutSets 
{ 

    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"WorkoutSet"]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"workoutType = %@", self.workoutType]; 

    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"workoutName" ascending:YES]; 
    [fetchRequest setSortDescriptors:@[sortDescriptor]]; 
    [fetchRequest setPredicate:predicate]; 
    self.fetchedResultsController = [[NSFetchedResultsController alloc] 
           initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext 
           sectionNameKeyPath:nil cacheName:nil]; 

    NSError *error; 
    if (![self.fetchedResultsController performFetch:&error]) 
    { 
     NSLog(@"Fetch failed: %@", error); 
    } 
} 

То, что я борюсь с это:

  • Как определить количество строк для каждой секции через базовую модель данных путем выбора количества записей с уровнем обучения 1 или 2 или 3.
  • Как заполнить строки каждого раздела, извлекая правильные элементы.
  • Как указать заголовок для каждого раздела.
+3

Вы в значительной степени находитесь там. Просто проверьте документацию для 'NSFetchedResultsController', в частности параметр' sectionNameKeyPath' указанного инициализатора, который вы хотите установить как свойство 'trainingLevel'. – Rog

+0

Также обратите внимание, что ваш получатель 'fetchedResultsController' должен выполнять выборку, а не' fetchWorkoutSet', иначе у вас будет два разных вызова, если вам нужно убедиться, что набор тренировок был выбран, и вам нужны fetchedResults. – memmons

ответ

17

Вот хороший учебник по использованию fetchedResultsControllers: http://www.raywenderlich.com/999/core-data-tutorial-for-ios-how-to-use-nsfetchedresultscontroller

Создайте некоторые свойства, чтобы держать свой контекст и выбирает:

@property (nonatomic,strong)NSManagedObjectContext* managedObjectContext; 
@property (nonatomic,retain)NSFetchedResultsController *fetchedResultsController; 

В вашей fetchedResultsController свойства используйте sectionKeyNamePath настроить свои неправдоподобные результаты в секциях:

- (NSFetchedResultsController *)fetchedResultsController { 

    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
              entityForName:@"Workouts" 
            inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
     initWithKey:@"workoutName" ascending:NO]; 
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
     [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
      managedObjectContext:managedObjectContext 
       sectionNameKeyPath:@"trainingLevel" 
         cacheName:@"Root"]; 
    self.fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 

    return _fetchedResultsController; 

} 

Ваша начальная популяция вашего fetchedResultsController может произойти в вашем -viewDidLoad:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Update to handle the error appropriately. 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     exit(-1); // Fail 
    } 
} 

Вы бы затем вернуть количество секций и количество строк в разделах, как это:

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

- (NSInteger)tableView:(UITableView *)tableView 
numberOfRowsInSection:(NSInteger)section 
{ 
    id <NSFetchedResultsSectionInfo> sectionInfo = 
     [[[self fetchedResultsController] sections] objectAtIndex:section]; 

    return [sectionInfo numberOfObjects];   
} 

Вы можете получить по управляемым объект для конкретных строк следующим образом:

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

    // init the cell 
    // and whatever other setup needed 

    WorkoutSet *workoutSet = 
     [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    // configure the cell from the managedObject properties 
} 
+0

Я пробовал выше, не повезло, В основном у вас проблемы с концом, где вы сказали использовать NSManagedObject .... Не знаете, как я могу добраться до моих данных через это ... Спасибо – user2512523

+1

@ user2512523 Обновлен с дополнительным кодом для сделайте это яснее. Ваши объекты 'WorkoutSet' - это те, которые возвращаются' fetchedResultsController'. – memmons

+0

@ user2512523 Если этот ответ вам помог, отметьте его как принятый, поэтому вопрос не показывается открытым. – memmons

Смежные вопросы