按日期排序 UICollectionView
Sort UICollectionView by Date
我的应用包含一个 plist 文件,它是我的 UICollectionView 数据。 plist 看起来像这样:
这是我的集合视图代码:
-(NSArray *)content {
if (!_content) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
_content = [help allValues];
_titles = [help allKeys];
NSLog(@"CONTENT%@", _content);
}
return _content;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [self.content count];
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"MM/dd/yyyy";
NSDate *date = [dateFormatter dateFromString:[self.titles objectAtIndex:indexPath.row]];
dateFormatter.dateFormat=@"MMMM";
NSString *monthString = [[dateFormatter stringFromDate:date] capitalizedString];
dateFormatter.dateFormat=@"dd";
NSString *dayString = [dateFormatter stringFromDate:date];
static NSString *cellIdentifier = @"cvCell";
CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
[cell.labels setText:[[self.content objectAtIndex:indexPath.row] valueForKey:@"verse"]];
[cell.month setText:monthString];
[cell.day setText:dayString];
return cell;
}
视图如下所示:
如您所知,这与我希望的布局方式不太一样。我更喜欢从左到右、从上到下的顺序,或者最新的条目在前,但我不太明白。对我如何完成这个有什么建议吗?
更新:
我添加了一个 NSArray 并使用它首先从 plist 获取数据,然后使用 NSSortDescriptor 创建 _content
数组。在NSLog中,它按照我想要的顺序显示,但最终结果没有改变:
-(NSArray *)content {
if (!_content) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
_sortedArray = [help allValues];
_titles = [help allKeys];
NSSortDescriptor* nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"theDate" ascending:NO];
_content = [_sortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameSortDescriptor]];
NSLog(@"%@", _content);
}
return _content;
}
有两种方法可以做到这一点。一种是将您的 plist 设置为在根级别包含一个数组而不是字典(参见屏幕截图)。这确保您保留项目的顺序(字典没有顺序)。
另一种方法是根据键对项目进行排序。您可以按如下方式执行此操作:
-(NSArray *)content {
if (!_content) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
_titles = [help allKeys];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"MM/dd/yyyy";
NSArray *sortedTitles = [_titles sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
NSDate *date1 = [dateFormatter dateFromString:obj1];
NSDate *date2 = [dateFormatter dateFromString:obj2];
return [date1 compare:date2];
}];
_sortedArray = [[NSMutableArray alloc] init];
for (NSString *title in sortedTitles) {
[_sortedArray addObject:[help objectForKey:title]];
}
_content = _sortedArray;
NSLog(@"%@", _content);
}
return _content;
}
不要将数据存储为字典。字典本质上是无序的 collections。使其成为字典数组,按日期排序。
一旦你有了一个项目数组,你可以使用以下方法分段和行获取它:
编辑:
在Objective-C
NSInteger columns = 3;
NSInteger numberOfSections = (NSInteger) ceil( count/(double)columns));
NSInteger indexOfCell = indexPath.section * columns + indexPath.row;
在Swift
let columns = 3
let numberOfsections = Int(ceil(Double(array.count) / Double(columns)))
let indexOfCell = indexPath.section * columns + indexPath.row
Columns 将是您 collection.
中的列数
numberOfSections
将是您 collection 中的部分总数。你 return 在你的 numberOfSectionsInCollectionView
函数中。
indexOfCell
会根据请求的部分和行为您提供 object 数组的索引。您将使用它在 cellForItemAtIndexPath
函数中获取 object。
或者,您可以将数据存储为字典数组的数组,其中外部数组是您的部分,内部数组是每个部分的行,每个字典将是该单元格的数据。
我的应用包含一个 plist 文件,它是我的 UICollectionView 数据。 plist 看起来像这样:
这是我的集合视图代码:
-(NSArray *)content {
if (!_content) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
_content = [help allValues];
_titles = [help allKeys];
NSLog(@"CONTENT%@", _content);
}
return _content;
}
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
return 1;
}
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
return [self.content count];
}
-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
}
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"MM/dd/yyyy";
NSDate *date = [dateFormatter dateFromString:[self.titles objectAtIndex:indexPath.row]];
dateFormatter.dateFormat=@"MMMM";
NSString *monthString = [[dateFormatter stringFromDate:date] capitalizedString];
dateFormatter.dateFormat=@"dd";
NSString *dayString = [dateFormatter stringFromDate:date];
static NSString *cellIdentifier = @"cvCell";
CVCell *cell = (CVCell *)[collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
[cell.labels setText:[[self.content objectAtIndex:indexPath.row] valueForKey:@"verse"]];
[cell.month setText:monthString];
[cell.day setText:dayString];
return cell;
}
视图如下所示: 如您所知,这与我希望的布局方式不太一样。我更喜欢从左到右、从上到下的顺序,或者最新的条目在前,但我不太明白。对我如何完成这个有什么建议吗?
更新:
我添加了一个 NSArray 并使用它首先从 plist 获取数据,然后使用 NSSortDescriptor 创建 _content
数组。在NSLog中,它按照我想要的顺序显示,但最终结果没有改变:
-(NSArray *)content {
if (!_content) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
_sortedArray = [help allValues];
_titles = [help allKeys];
NSSortDescriptor* nameSortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"theDate" ascending:NO];
_content = [_sortedArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:nameSortDescriptor]];
NSLog(@"%@", _content);
}
return _content;
}
有两种方法可以做到这一点。一种是将您的 plist 设置为在根级别包含一个数组而不是字典(参见屏幕截图)。这确保您保留项目的顺序(字典没有顺序)。
另一种方法是根据键对项目进行排序。您可以按如下方式执行此操作:
-(NSArray *)content {
if (!_content) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES);
NSString *plistPath = [[paths lastObject] stringByAppendingPathComponent:@"myJournal.plist"];
NSDictionary *help = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
_titles = [help allKeys];
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.dateFormat = @"MM/dd/yyyy";
NSArray *sortedTitles = [_titles sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
NSDate *date1 = [dateFormatter dateFromString:obj1];
NSDate *date2 = [dateFormatter dateFromString:obj2];
return [date1 compare:date2];
}];
_sortedArray = [[NSMutableArray alloc] init];
for (NSString *title in sortedTitles) {
[_sortedArray addObject:[help objectForKey:title]];
}
_content = _sortedArray;
NSLog(@"%@", _content);
}
return _content;
}
不要将数据存储为字典。字典本质上是无序的 collections。使其成为字典数组,按日期排序。
一旦你有了一个项目数组,你可以使用以下方法分段和行获取它:
编辑:
在Objective-C
NSInteger columns = 3;
NSInteger numberOfSections = (NSInteger) ceil( count/(double)columns));
NSInteger indexOfCell = indexPath.section * columns + indexPath.row;
在Swift
let columns = 3
let numberOfsections = Int(ceil(Double(array.count) / Double(columns)))
let indexOfCell = indexPath.section * columns + indexPath.row
Columns 将是您 collection.
中的列数numberOfSections
将是您 collection 中的部分总数。你 return 在你的 numberOfSectionsInCollectionView
函数中。
indexOfCell
会根据请求的部分和行为您提供 object 数组的索引。您将使用它在 cellForItemAtIndexPath
函数中获取 object。
或者,您可以将数据存储为字典数组的数组,其中外部数组是您的部分,内部数组是每个部分的行,每个字典将是该单元格的数据。