TableView Sections 按过期排序

Posted

技术标签:

【中文标题】TableView Sections 按过期排序【英文标题】:TableView Sections sort by expires next 【发布时间】:2014-03-23 12:19:54 【问题描述】:

所以我正在开发一个小型 ToDo 应用程序。 TableView 显示具有名称(字符串)和日期(日期)属性的 CoreData 实体。 目前 NSfetchedResultsController 按 ToDo 的日期对 tableView 进行排序,但我还想要一些部分,例如“过期的 ToDo - 有过去的日期”或“下周的 ToDo”

我怎样才能做到这一点?

代码 NSFetchedResultsController:

- (NSFetchedResultsController *)fetchedResultsController 

    if (_fetchedResultsController != nil) 
        return _fetchedResultsController;
    

    // Create and configure a fetch request with the Book entity.
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Inventory" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    // Create the sort descriptors array.
    NSSortDescriptor *productDescriptor = [[NSSortDescriptor alloc] initWithKey:@"inventoryProductName" ascending:YES];
    NSSortDescriptor *dateDescriptor = [[NSSortDescriptor alloc] initWithKey:@"expireDate" ascending:YES];
    NSArray *sortDescriptors = @[dateDescriptor,productDescriptor];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // Create and initialize the fetch results controller.
    _fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"inventoryProductName" cacheName:@"Root"];
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;

代码表视图:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    return [[self.fetchedResultsController sections] count];


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    id <NSFetchedResultsSectionInfo> sectionInfo = [self.fetchedResultsController sections][section];
    return [sectionInfo numberOfObjects];


- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath 

    Inventory *inventory = [self.fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = inventory.inventoryProductName;

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateStyle:NSDateFormatterShortStyle];
    NSDate *dt = inventory.expireDate;
    NSString *dateAsString = [formatter stringFromDate:dt];
    //[formatter release];

    cell.detailTextLabel.text = [NSString stringWithFormat:@"Expires at: %@", dateAsString];

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath


    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell.
    [self configureCell:cell atIndexPath:indexPath];
    return cell;


【问题讨论】:

【参考方案1】:

您需要为您的待办事项提供另一个反映您想要的属性。至于“过去”、“下周”,您可以使用通过自定义 getter 动态计算的 瞬态属性。在某些情况下,您必须将其作为(非瞬态)属性实际保存,以便获取的结果控制器工作。

对于可预测的排序,实际的属性值可能只是一个数字 - 这将允许您还包括与日期无关的类别,例如“已取消”、“无效”等。

【讨论】:

以上是关于TableView Sections 按过期排序的主要内容,如果未能解决你的问题,请参考以下文章

展开和折叠 tableView Sections

将 JSON 元素放入 TableView 作为 Sections Title 和 Cell title

Expand Collapse TableView Sections with Core Data 任何更优雅的想法

按多个数组对 Tableview 行进行排序

按日期快速排序我的tableView

按副标题排序 tableview 单元格