ave*_*ged 10 core-data nsfetchedresultscontroller ios
我目前有一个选项,允许用户更改我的iPhone应用程序中的类别的显示顺序.
我想使用NSFetchedResultsController对表视图进行分区,以便节标题是"category.displayOrder"排序的"category.name",其中"category"与我正在获取的实体具有TO-ONE关系.我可以让切片正常工作的唯一方法是使用"category.displayOrder"作为节标题.
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.displayOrder" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setFetchBatchSize:10];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:managedObjectContext
sectionNameKeyPath:@"category.name"
cacheName:nil];
Run Code Online (Sandbox Code Playgroud)
关于如何命名部分标题与我正在排序的属性有什么不同的任何想法?
Rog*_*Rog 15
不确定我是否完全理解你的问题,但我在我的应用程序中做了类似的事情,这是我如何让它工作:
首先,fetchedResultsController方法,我根据我想要做的事情设置排序描述和谓词.在这种情况下,我想按照发布日期THEN按名称对电影标题进行排序.然后使用我的谓词,我抓住特定"类型"的实体并在某个"releaseDate"范围内.
在我的fetchresultscontroller定义中,您将sectionNameKeyPath设置为"releaseDate",因此我的节标题将基于日期.
- (NSFetchedResultsController *)fetchedResultsController {
if (fetchedResultsController_ != nil) {
return fetchedResultsController_;
}
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSSortDescriptor *sortByReleaseDate = [[NSSortDescriptor alloc] initWithKey:@"releaseDate" ascending:NO];
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByReleaseDate,sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortByName release];
[sortByReleaseDate release];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(type == 'Movies') AND (releaseDate <= %@) AND (releaseDate >= %@)", [NSDate date], [NSDate dateWithTimeIntervalSinceNow:kOneDayTimeInterval*-30]];
[fetchRequest setPredicate:predicate];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Movie" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"releaseDate" cacheName:nil];
...// Perform and return fetch here, error handling etc...
return fetchedResultsController_;
}
Run Code Online (Sandbox Code Playgroud)
然后在我的表视图数据源委托方法中,我将我的NSDate转换为NSString后返回每个标题的实际标题(请记住,您必须为表视图标题标题返回NSString.
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
NSString *rawDateStr = [[[self.fetchedResultsController sections] objectAtIndex:section] name];
//convert default date string to NSDate...
NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZ"];
NSDate *date = [formatter dateFromString:rawDateStr];
//convert NSDate to format we want...
[formatter setDateFormat:@"d MMMM yyyy"];
NSString *formattedDateStr = [formatter stringFromDate:date];
return formattedDateStr;
}
Run Code Online (Sandbox Code Playgroud)
因此,如果我想更改我的数据显示方式,例如titleName,我将把fetchedResultsController对象更改为:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"titleName" cacheName:nil];
Run Code Online (Sandbox Code Playgroud)
并修改我的tableview:titleForHeaderInSection:数据源方法只返回titleName(已经是一个字符串):
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
return [[[self.fetchedResultsController sections] objectAtIndex:section] name];
}
Run Code Online (Sandbox Code Playgroud)
我希望这可以帮助您找到解决您具体问题的方法.
干杯,罗格
Mar*_*gan 10
我有同样的问题,我有另一种解决方案 - 对sectionNameKeyPath使用transient属性,即category.sectionName.似乎如果你使用核心数据属性作为sectionNameKeyPath,它将尝试使用它进行排序.
所以使用上面的例子:
NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.displayOrder" ascending:YES];
NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1, sortDescriptor2, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"category.sectionName" cacheName:nil];
Run Code Online (Sandbox Code Playgroud)
Category.h:
@interface Category : NSManagedObject
@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSNumber* displayOrder;
-(NSString*) sectionName;
@end
Run Code Online (Sandbox Code Playgroud)
Category.m:
@implementation Category
@dynamic name;
@dynamic displayOrder;
-(NSString*) sectionName{
return self.name;
}
@end
Run Code Online (Sandbox Code Playgroud)
然后在你的视图控制器中:
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
id<NSFetchedResultsSectionInfo> sectionInfo=[self.resultsController.sections objectAtIndex:section];
return sectionInfo.name;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10793 次 |
| 最近记录: |