我的应用程序包含一个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;
}
答案 0 :(得分:1)
有两种方法可以做到这一点。一种是将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;
}
答案 1 :(得分:1)
不要将您的数据存储为字典。字典本质上是无序集合。使它成为一个字典数组,按日期排序。
一旦你有一个项目数组,你可以使用:
在部分和行中获取它在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
列将是集合中的列数。
numberOfSections
将是您的收藏中的部分总数。您可以在numberOfSectionsInCollectionView
函数中返回该内容。
indexOfCell
会根据请求的部分和行为您提供对象数组的索引。您可以使用它来获取cellForItemAtIndexPath
函数中的对象。
或者,您可以将数据存储为字典数组的数组,其中外部数组是您的部分,内部数组是每个部分的行,每个字典都是该单元格的数据。