我在一个部分中有一个实体显示在表视图中.实体有两个属性,即workoutName和trainingLevel.两者都是字符串类型.培训级别包括3种类型:1,2,3(trainingLevel =(整数16或字符串类型?哪个是理想的?)我想将表分为三个部分,每个部分包含相应培训级别的条目.
我该怎么做?我目前使用的代码如下:
- (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的条目数.
>如何通过获取正确的项目来填充每个部分的行.
>如何给每个段头标题.
解决方法
以下是使用fetchedResultsController的一个很好的教程:
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 }