iOS UITableView部分与fetchedResultsController混淆
我只有一个部分在一个表格视图中显示一个实体。 该实体有两个属性, workoutName
和trainingLevel
。 两者都是stringtypes。 训练级别由三种types组成:1,2,3(trainingLevel =(整数16或stringtypes,哪一个是理想的?)我想将表格分成三个部分,每个部分包含相应训练级别的条目。
我该怎么做呢? 我目前使用的代码如下:
- (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的条目数。
- 如何通过获取正确的项目填充每个部分的行。
- 如何给每个部分标题一个标题。
这里是使用fetchedResultsControllers
一个很好的教程: http : fetchedResultsControllers
创build一些属性来保存上下文并获取:
@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]; }
然后你可以像这样获得你的pipe理对象的特定行:
- (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 }