Как отобразить события в tableView отсортированы по NSDate? - PullRequest
0 голосов
/ 21 июня 2011

У меня есть приложение событий, которое получает данные о событиях из базы данных sqlite и отображает их в tableView. Я также преобразовал дату из таблицы sqlite из NSString в NSDate. Теперь я хочу отображать записи, отсортированные по дате, а также не хочу отображать событие, которое завершено.

Вот мой EventViewController.m

#import "EventViewController.h"


@implementation EventViewController

@synthesize events,eDate;

#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];


    self.title = @"Events";


    //Get the DBAccess object;
    DBAccess *dbAccess = [[DBAccess alloc] init];

    //Get event array from database
    self.events = [dbAccess getAllEvents];

    //Close the database
    [dbAccess closeDatabase];

    //Release dbAccess object to free its memory
    [dbAccess release];

}


 // Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations.
    return YES;
}



#pragma mark -
#pragma mark Table view data source

// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSLog(@"# of Sections");
    return 1;
}


// Customize the number of rows in the table view.
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    //NSLog(@"Countring Rows");
    return [self.events count];
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

    NSLog(@"Creating cell");
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.selectionStyle = UITableViewCellSelectionStyleBlue;

    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;   

    event = [self.events objectAtIndex:[indexPath row]];



    // Configure the cell.
    cell.textLabel.text = event.name;

    cell.detailTextLabel.text = event.location;

    return cell;
}


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //Formate Date from string to NSDate
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:@"yyyyMMdd"];

    NSDate *eeDate = [dateFormatter dateFromString:event.date];

    NSLog(@"%@", eeDate);

    [dateFormatter setDateFormat:@"EEEE MMMM d, YYYY"];
    eDate = [dateFormatter stringFromDate:eeDate];  

    NSLog(@"%@", eDate);
    [dateFormatter release];


    //Event *event;

    if (tableView == self.tableView)
    {
        event = [self.events objectAtIndex:[indexPath row]];
        //event = [[self.events objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];
    }
    else
    {
        event = [self.events objectAtIndex:[indexPath row]];
    }

    EventDetailViewController *detailViewController = [[EventDetailViewController alloc]
                                                       initWithStyle:UITableViewStyleGrouped];

    detailViewController.eventDetail = [events objectAtIndex:indexPath.row];
    detailViewController.eventName = event.name;
    detailViewController.eventLocation = event.location;
    detailViewController.eventNote = event.note;
    detailViewController.eventDate = eDate;
    detailViewController.eventTime = event.time;

    //Pust detail controller on to the stack
    [self.navigationController pushViewController:(UITableViewController *)detailViewController animated:YES];


    //release the view controller
    [detailViewController release];


}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)dealloc
{
[events release];

    [super dealloc];
}


@end

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Поскольку дата представлена ​​как yyyyMMdd, мы можем использовать обычное сравнение строк, чтобы исключить более старые события, используя текущую дату.Затем мы можем отсортировать оставшиеся события.

NSArray * allEvents = [dbAccess getAllEvents];

NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
[dateFormatter setDateFormat:@"yyyyMMdd"];
NSString * todaysDateAsString = [dateFormatter stringFromDate:[NSDate date]];

NSArray * futureEvents = [allEvents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"date >= %@", todaysDateAsString]];

NSSortDescriptor * descriptor = [NSSortDescriptor descriptorWithKey:@"date" ascending:YES];
self.events = [futureEvents sortedArrayUsingDescriptors:[NSArray arrayWithObject:descriptor]];
0 голосов
/ 21 июня 2011

Вы можете использовать NSSortDescriptors для сортировки ваших событий.

Предположим, у вас есть свойство finished, которое указывает, когда событие завершено, вы можете отфильтровать массив следующим образом

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"finished = NO"];
self.events = [[dbAccess getAllEvents] filteredArrayUsingPredicate:predicate];

И затем, если у объекта события есть свойство date, которое вы пытаетесь отсортировать по возрастанию, вы можете использовать NSSortDescriptor для его сортировки.

NSSortDescriptor *descriptor = [NSSortDescriptor alloc] initWithKey:@"date" ascending:YES];
NSArray *arrayDescriptors = [NSArray arrayWithObject: descriptor];
self.events = [self.events sortedArrayUsingDescriptors:arrayDescriptors];
[descriptor release];
...