2013-04-20 45 views
0

我有一個標題在UITableView與不同的日期與dd.MMMM-EEEE合成。我怎樣才能根據時間從舊到新排序呢?我應該使用?NSSortDescriptor使用NSSortDescriptor排序UITableview標題與setDateFomat:@「dd.MMMM-EEEE

這裏是我的代碼:

@synthesize managedObjectContext, pictureListData; 
@synthesize scroll; 

-(IBAction)scrolldown:(id)sender{ 
    NSCalendar *cal = [NSCalendar currentCalendar]; 

    NSDate *today = [NSDate date]; 
    NSInteger index = NSNotFound; 
    if ([pictureListData containsObject:today]) { 
     index = [pictureListData indexOfObject:today]; 
    } 

    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:index inSection:0]; 
    [self.tableView scrollToRowAtIndexPath:indexPath 
          atScrollPosition:UITableViewScrollPositionNone 
            animated:YES]; 
} 
-(void)viewDidLoad{ 
    NSSortDescriptor * sortDesc = [[NSSortDescriptor alloc] initWithKey:@"self" ascending:YES]; 
    [pictureListData sortUsingDescriptors:[NSArray arrayWithObject:sortDesc]]; 
     [self.tableView reloadData]; 
} 
- (void)viewWillAppear:(BOOL)animated 
{ 
    // Repopulate the array with new table data 
    [self readDataForTable]; 

    NSCalendar *cal = [NSCalendar currentCalendar]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"dd.MMMM - EEEE"]; 
    NSDate *today = [NSDate date]; 
    [pictureListData enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { 
     Pictures *picture = (Pictures *)obj; 
     NSDate *date = [dateFormatter dateFromString:picture.title]; 
     NSDateComponents *components = [cal components:NSDayCalendarUnit 
               fromDate:date 
               toDate:today 
               options:0]; 
     if ([components day]==0) { 
      *stop = TRUE; 
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:idx inSection:0]; 
      [self.tableView scrollToRowAtIndexPath:indexPath 
            atScrollPosition:UITableViewScrollPositionTop 
              animated:YES]; 
     } 
    }]; 
} 
// When the view reappears, read new data for table 


// Grab data for table - this will be used whenever the list appears or reappears after an add/edit 
- (void)readDataForTable 
{ 
    // Grab the data 
    pictureListData = [CoreDataHelper getObjectsForEntity:@"Pictures" withSortKey:@"title" andSortAscending:YES andContext:managedObjectContext]; 

    // Force table refresh 
    [self.tableView reloadData]; 
} 

#pragma mark - Actions 

// Button to log out of app (dismiss the modal view!) 


#pragma mark - Segue methods 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Get a reference to our detail view 
    PictureListDetail *pld = (PictureListDetail *)[segue destinationViewController]; 

    // Pass the managed object context to the destination view controller 
    pld.managedObjectContext = managedObjectContext; 

    // If we are editing a picture we need to pass some stuff, so check the segue title first 
    if ([[segue identifier] isEqualToString:@"EditPicture"]) 
    { 
     // Get the row we selected to view 
     NSInteger selectedIndex = [[self.tableView indexPathForSelectedRow] row]; 

     // Pass the picture object from the table that we want to view 
     pld.currentPicture = [pictureListData objectAtIndex:selectedIndex]; 
    } 
} 

#pragma mark - Table view data source 

// Return the number of sections in the table 
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

// Return the number of rows in the section (the amount of items in our array) 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return [pictureListData count]; 
} 

// Create/reuse a table cell and configure it for display 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

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

    // Get the core data object we need to use to populate this table cell 
    Pictures *currentCell = [pictureListData objectAtIndex:indexPath.row]; 

    // Fill in the cell contents 
    cell.textLabel.text = [currentCell title]; 
    cell.detailTextLabel.text = [currentCell desc]; 

    // If a picture exists then use it 
    if ([currentCell smallPicture]) 
    { 
     cell.imageView.contentMode = UIViewContentModeScaleAspectFit; 
     cell.imageView.image = [UIImage imageWithData:[currentCell smallPicture]]; 
    } 

    return cell; 
} 

// Swipe to delete has been used. Remove the table item 
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
     // Get a reference to the table item in our data array 
     Pictures *itemToDelete = [self.pictureListData objectAtIndex:indexPath.row]; 

     // Delete the item in Core Data 
     [self.managedObjectContext deleteObject:itemToDelete]; 

     // Remove the item from our array 
     [pictureListData removeObjectAtIndex:indexPath.row]; 

     // Commit the deletion in core data 
     NSError *error; 
     if (![self.managedObjectContext save:&error]) 
      NSLog(@"Failed to delete picture item with error: %@", [error domain]); 

     // Delete the row from the data source 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
} 

@end 

回答

2

修改您的數據源初始化方法定期sortDescriptor是不夠的,因爲你需要的dateString改變日期比較

- (void)readDataForTable 
{ 
    // Grab the data 
    pictureListData = [CoreDataHelper getObjectsForEntity:@"Pictures" withSortKey:@"title" andSortAscending:YES andContext:managedObjectContext]; 

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init]; 
    [dateFormatter setDateFormat:@"dd.MMMM - EEEE"]; 

    [pictureListData sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 

     Pictures *picture1 = (Pictures *)obj1; 
     Pictures *picture2 = (Pictures *)obj2; 

     NSDate *date1 = [dateFormatter dateFromString:picture1.title]; 
     NSDate *date2 = [dateFormatter dateFromString:picture2.title]; 

     return [date1 compare:date2]; 
    }]; 

    // Force table refresh 
    [self.tableView reloadData]; 
} 
+0

我得到這個錯誤時,我把我的字符串標題從字符串轉換爲日期。 'NSInvalidArgumentException',原因:'不可接受的屬性類型:property =「title」;期望的類型= NSDate;給定類型= __NSCFString;價值= 4月21日星期日。' – Clarence 2013-04-21 05:47:39

+0

@Clarence在哪條線上得到錯誤。您似乎在「圖片」中更改了「標題」的類型。 – Anupdas 2013-04-21 06:34:07

+0

我將xcdatamodeld文件中的「標題」從字符串更改爲日期。然後當我打開模擬器並保存它時,我得到了這個錯誤。 – Clarence 2013-04-21 06:36:11

相關問題