从Unix时间戳日期ios数组在Uitableview中创建动态部分?
Posted
技术标签:
【中文标题】从Unix时间戳日期ios数组在Uitableview中创建动态部分?【英文标题】:Create dynamic Sections in Uitableview from array of Unix timestamp Date ios? 【发布时间】:2014-01-23 11:17:22 【问题描述】:我有表事件,其中日期存储在 Unix 时间戳格式(即 1390680000)中,我想用 Month Wise 在 uitableview 中显示它,
我正在使用 SQLITE3。
喜欢,
aray Events:(
Id = 67;
SDate = 1390680000;
,
Id = 68;
SDate = 1395600000;
.
.
.
我查了很多,但我什么都想不通,
那么,我如何从 Unix 时间戳日期 ios 在 Uitableview 中创建动态部分?
谢谢大家。
【问题讨论】:
这个顺序实际上是“年、月”而不是“月”(即 2011 年 4 月会紧随 2012 年 4 月)吗? @***foe: 好的,我也将格式化程序更改为 yy,但是如何使用它创建数组数组。 我要求您澄清要求。 @***foe:我更新了问题。请检查。 【参考方案1】:如果我错了,请纠正我,
正如大家所建议的,在 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];
...
【讨论】:
感谢回答,但我必须使用什么日期键? 因为我有注意使用你的钥匙,在我的回答中我有一个对象 StartDate ,据我所知,我已经安排了这一切,你可以在这里使用你的钥匙。跨度> 【参考方案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
【讨论】:
对不起,我没看懂这段代码,你能把代码用于排列数组吗?【参考方案3】:1.使用字典,其中键为月份,值作为那些事件的字典,这些事件的字典在该月份以下。
2.更新主词典后,只需重新加载 uitableview。将节数视为主字典键数,将每个节中的单元格视为子字典键数。
【讨论】:
【参考方案4】:我认为您应该将数据格式化为NSDictionary
,并以月份为键,并且每个键都将具有按排序顺序排列的消息数组。那么部分的数量将是
return [dictionary.allKeys count]
你可以得到每个部分的行数是
NSArray *messages = [dictionary obejctForKey:indexPath.section];
return [messages count]
【讨论】:
【参考方案5】:这是你的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;
【讨论】:
我没有使用核心数据,如何将其存储在数组中? Thnks ,但我怎样才能检索节标题名称? 请检查我之前提供的groupedByMonthYear函数,你可以这样格式化。它不是优化的代码,请在您认为合适的地方进行优化。基本思想是,您获取日期并对其进行格式化。以上是关于从Unix时间戳日期ios数组在Uitableview中创建动态部分?的主要内容,如果未能解决你的问题,请参考以下文章
如何从 JS 中的 Y-m-d 日期获取 unix 时间戳?
如何从给定城市的给定日期和时间获取 unix 纪元时间戳(以秒为单位)?
使用 sql 将字符串纪元代码从 unix 时间戳转换为日期
pandas使用to_datetime函数将unix时间戳转化为日期时间格式(Convert Unix times to DateTime)