iphone uitableview按实施日期分组

iphone uitableview按实施日期分组,iphone,uitableview,date,implementation,Iphone,Uitableview,Date,Implementation,因此,目前我有一个显示消息的表,但我想按日期对消息进行分组,例如 1998年4月5日星期二//页眉 信息1 信息2 信息3 1998年4月6日星期三 信息1 等等 所以现在,它只是一个长NSMutableArray oldArr(排序) 我想做的是创建另一个NSMutableArray(groupArr)的唯一日期对象(DateGroup),其中每个日期组都有以下IVAR: int size; //number of messages for date int index; //index

因此,目前我有一个显示消息的表,但我想按日期对消息进行分组,例如

1998年4月5日星期二//页眉


信息1 信息2 信息3 1998年4月6日星期三


信息1 等等

所以现在,它只是一个长NSMutableArray oldArr(排序)

我想做的是创建另一个NSMutableArray(groupArr)的唯一日期对象(DateGroup),其中每个日期组都有以下IVAR:

int size; //number of messages for date
int index; //index of first message in the total array
//so I can easily retrieve the object when the section and row is asked
NSDate date; //need the date for the header
有了这些IVAR,我可以通过访问日期组大小来获取groupArr大小的所有节,通过访问日期组大小来获取所有单独的行大小,如果给定节,则通过获取索引+行来获取单个单元格的行参数

我认为这是最好的办法。但是,我在从oldArr填充groupArr时遇到了问题(这将动态增加大小)。我想用这个伪代码一个接一个地浏览oldArr:

NSDate date = nil;
int size = 1;
int index = 0;
for (int i = 0; i < oldArr.size; i++) {
    OldGroup* cur = [oldArr objectAt:i];
    if (date is different from cur->date){  //i know, it's pseudocode 
        DateGroup* newGroup = [[DateGroup alloc] initWithDate:cur->date index:index]; 
        [groupArr add:NewGroup];
        date = cur->date;
        index += size;
        size = 1; <br/>
    } else{ //the date is the same, so the object belongs in the group 
      [groupArr lastObject].size++;
    }
}
NSDate日期=nil;
int size=1;
int指数=0;
对于(int i=0;idate不同){//我知道,这是伪代码
DateGroup*newGroup=[[DateGroup alloc]initWithDate:cur->date index:index];
[groupArr add:NewGroup];
日期=当前->日期;
指数+=大小;
大小=1;
}else{//日期相同,因此对象属于该组 [groupArr lastObject].size++; } }

不管怎么说,虽然我认为这会奏效,但对我来说似乎很不公平。我曾考虑使用NSMutableArry的“indexOfObjectPassingTest”来查找下一个日期,但似乎无法在概念上实现它。我正试图设计一个好的方法来做到这一点。有什么建议吗?

我甚至还没有编译过这篇文章,所以要小心错误和泄漏,这可能不是最有效的方法。但我认为,在将日期分组时,可以使用NSDateFormatter切掉不关心的时间部分。结果是一个组数组,每个组都是事件数组,按日期排序。然后,您只需要一个排序谓词来按照您选择的显示顺序排列它,它就可以用于UITableView了

- (void)addDatedEvent:(MyEventClass*)newEvent ToGroup:(NSMutableArray*)dateGroups 
{
  NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
  [dateFormatter setTimeStyle:NSDateFormatterNoStyle];
  [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

  NSDate* eventDate = newEvent.evDate;
  NSString* dateString = [dateFormatter stringFromDate:eventDate];

  BOOL added = NO;
  for(NSMutableArray* group in dateGroups)
  {
    MyEventlass* firstEvent = [group objectAtIndex:0];
    NSDate* firstEventDate = firstEvent.evDate;
    NSString* firstEventDateString = [dateFormatter stringFromDate:firstEventDate];

    if([firstEventDateString isEqualToString:dateString])
    {
      // match - this event joins others in an existing group
      [group addObject:newEvent];
      added = YES;
    }
  }

  if(added == NO)
  {
    // need to create a new group since this is the first date
    NSMutableArray* newGroupArray = [NSMutableArray arrayWithObject:newEvent];
    [dateGroups addObject:newGroupArray];
  }
}

我认为你的想法是对的,但有一点值得注意的是,NSDate也有时间成分,所以你的日期比较需要考虑到这一点。非常感谢你的时间和努力,亚当!是的,你们的方法和我的非常相似——检查每个日期,看它是否属于你们。然而,我看到您实际上将整个message/“event”添加到了组中,这实际上非常有趣,尽管占用了大量空间。但是,我已经提供了一个排序消息数组,因此确实不需要逐个遍历该数组,因为它将始终转到最后一个。不过,这样做确实简化了很多。我是在我曾经做过的事情的背景下想象出来的。希望有帮助。就空间而言,它真的会很昂贵吗?数组存储一个指向MyEventClass对象的指针,它不必有副本。是的,这并不可怕。但我可以想象500条信息的花费。我最初的想法是只保留每个唯一日期的必要信息,但您的实现似乎更加直观。我决定使用这个的一个变体(按日期散列,而不是逐个查看)。谢谢