我在一个部分中有一个实体显示在表视图中.实体有两个属性,即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
- }