iphone uitableview сгруппирован по дате реализации - PullRequest
2 голосов
/ 03 августа 2010

Так что в настоящее время у меня есть таблица, которая отображает сообщения, но я бы хотел сгруппировать сообщения по дате, например,

вторник 4/5/98 // header


сообщение 1

сообщение 2

сообщение 3

Среда 4/6/98


сообщение 1

и т.д.

Так что сейчас это просто один длинный NSMutableArray oldArr (отсортированный).

То, о чем я думал, это создание другого NSMutableArray (groupArr) уникальных объектов даты (DateGroup), в котором каждая DateGroup будет иметь следующие ivars:

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

С помощью этих иваров я могу получить все разделы с размером groupArr, все отдельные размеры строк, получая доступ к размеру DateGroup, и отдельную ячейку, если дан раздел, аргументы строки, получая индекс + строка.

Я думаю, что это лучший способ сделать это. Однако у меня проблемы с заполнением groupArr из oldArr (который будет динамически увеличиваться в размере). Я думал о том, чтобы пройти один за другим через 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++;
    }
}

В любом случае, хотя я думаю, что это сработает, мне кажется, что это очень нелегко. Я думал об использовании «indexOfObjectPassingTest» NSMutableArry, чтобы найти следующую дату, но не могу реализовать ее концептуально. Я пытаюсь придумать хороший способ сделать это. Есть предложения?

1 Ответ

1 голос
/ 03 августа 2010

Я даже не скомпилировал это, так что остерегайтесь ошибок и утечек, и это, возможно, не самый эффективный способ.Но я думаю, что вы можете использовать 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];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...