我有表事件,其中日期存储在Unix时间戳格式中(即1390680000),我想在带有Month Wise的uitableview中显示它,
我正在使用SQLITE3。
等
aray Events:(
{
Id = 67;
SDate = 1390680000;
},
{
Id = 68;
SDate = 1395600000;
}
.
.
.
我搜索了很多,但我无法弄清楚任何事情,
那么,如何在Unix时间戳日期ios中创建Uitableview中的动态部分?
向所有人致意。
答案 0 :(得分:3)
如果我错了,请纠正我,
正如所有人建议的那样,在Dictionary中使用Array of Dictionary,为Title(Nsstring)放置两个对象,第二个是NSArray(用于单元格细节的dict),
我已在我的应用中实现了一种方法,
注意:使用您的数据键值。
使用以下代码排列数组,
-(NSMutableArray*)arrangeSection:(NSMutableArray *)source
{
NSDateFormatter *_formatter=[[NSDateFormatter alloc]init];
[_formatter setLocale:[NSLocale currentLocale]];
[_formatter setDateFormat:@"MMMM"];
NSMutableArray *arrayMain=[NSMutableArray array];
for (int i=0; i<source.count; i++){
NSDictionary *dict=source[i];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[dict objectForKey:@"StartDate"]doubleValue]];
NSString *mm=[_formatter stringFromDate:date];
NSMutableDictionary *secDict=[NSMutableDictionary dictionary];
NSMutableArray *secArray=[NSMutableArray array];
if (i==0){
[secDict setObject:mm forKey:@"Month"];
[secArray addObject:dict];
[secDict setObject:secArray forKey:@"Data"];
[arrayMain addObject:secDict];
}
else{
BOOL flg=NO;
for (NSDictionary *dict2 in arrayMain){
if([[dict2 objectForKey:@"Month"]isEqualToString:mm]){
flg=YES;
[[dict2 objectForKey:@"Data"]addObject:dict];
break;
}
}
if (!flg){
[secDict setObject:mm forKey:@"Month"];
[secArray addObject:dict];
[secDict setObject:secArray forKey:@"Data"];
[arrayMain addObject:secDict];
}
}
}
return arrayMain;
}
现在在tableview中使用as,
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return arrayEvents.count;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [[arrayEvents[section]objectForKey:@"Data"]count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
...
NSDictionary *aDict = [arrayEvents objectAtIndex:indexPath.section];
NSDictionary *maindict=[[aDict objectForKey:@"Data"]objectAtIndex:indexPath.row];
...
}
答案 1 :(得分:2)
根据sateesh的建议,示例代码如下所示,
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
[dictname count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
if (section == 0) {
return [[dictname valueforkey:@"key1"] count];
} else {
return [[dictname valueforkey:@"key1"] count];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if (indexPath.section == 0) {
// particular code
} else {
// particular code
}
}
答案 2 :(得分:1)
1.使用带有键的字典作为月份和值作为那些事件的字典来到那个月。
2.更新主词典后,只需重新加载uitableview。考虑将no作为主要字典键计数和每个部分中的单元格作为子字典键计数。
答案 3 :(得分:1)
这是你的fetchresultController,请注意groupedByMonthYear
[[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:[DeputyCoreDataManager sharedManager].mainQueueManagedObjectContext sectionNameKeyPath:@"dttStartTime.groupedByMonthYear" cacheName:nil];
这是您的NSDate + Enhance.m类别中的功能之一,请根据您的日期格式进行更改。
- (NSString *)groupedByMonthYear{
NSDateComponents *components = [[NSCalendar currentCalendar] components:NSMonthCalendarUnit fromDate:self];
NSString *monthString = [NSString stringWithFormat: @"%d", [components month]];
NSDateFormatter* dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"MM"];
NSDate* myDateMonth = [dateFormatter dateFromString:monthString];
[dateFormatter setDateFormat:@"yyyy"];
NSString *stringFromYear = [NSString stringWithFormat:@"%@",[dateFormatter stringFromDate:self]];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"MMMM"];
NSString *stringFromMonth = [formatter stringFromDate:myDateMonth];
return [NSString stringWithFormat:@"%@ %@", stringFromMonth, stringFromYear];
}
编辑:
对于非核心数据解决方案,它是直截了当的。 1.使用键作为日期创建NSMutableDictionary,并将值作为事件数组。 2.您遍历所有活动,即可获得该活动当月的第一个日期。然后检查字典中是否有密钥,如果存在,则获取值,即数组。并将您的事件插入该数组。如果密钥不存在,则创建一个数组,将数组放入地图,然后添加事件。
NSMutableDictionary *eventsMap = @{}.mutableCopy;
for (Event *event in data) {
NSDate *firstDateOfMonth = event.date.firstDateOfMonth;
NSMutableArray *events = [eventsMap objectForKey:firstDateOfMonth];
if (!events) {
events = @[].mutableCopy;
[eventsMap setObject:events forKey:firstDateOfMonth];
}
[events addObject:event];
}
表格视图
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
[eventsMap count];
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
//TODO: need sorting
Array *sortedKeys = [eventsMap allKeys];
return [sortedKeys objectAt:section];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//TODO: need sorting
Array *sortedKeys = [eventsMap allKeys];
return [[eventsMap objectForKey:[sortedKeys objectAt:indexPath.section]] objectAt:indexPath.row];
}
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
Array *sortedKeys = [eventsMap allKeys];
NSDate *titleDate = [sortedKeys objectAt:section];
return titleDate.groupedByYearMonth;
}
答案 4 :(得分:1)
我认为您应该将数据格式化为NSDictionary
,并将月份作为键,每个键都将按排序顺序排列消息数组。那么部分的数量将是
return [dictionary.allKeys count]
您可以获得每个部分的行数
NSArray *messages = [dictionary obejctForKey:indexPath.section];
return [messages count]