UITableView中的多个部分

时间:2012-12-13 22:06:11

标签: objective-c uitableview nsfetchedresultscontroller

实际上我只使用一个部分。我按日期对存储在核心数据中的数据进行排序。

我希望两个部分最新历史记录)。在我的第一部分“最新”中我想提出我的最新日期,而在另一部分“历史”我希望将其他日期按日期排序。

我的表格是可编辑的,我正在使用NSFetchedResultsController。

以下是 numberOfRowsInSection 的示例代码:

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

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Info"
                                    inManagedObjectContext:self.managedObjectContext]];

    // Define how we want our entities to be sorted
    NSSortDescriptor* sortDescriptor = [[[NSSortDescriptor alloc]
                                    initWithKey:@"date" ascending:NO] autorelease];
    NSArray* sortDescriptors = [[[NSArray alloc] initWithObjects:sortDescriptor, nil] autorelease];

    [fetchRequest setSortDescriptors:sortDescriptors];

    NSString *lower = [mxData.name lowercaseString];
    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(name = %@)", lower];

    [fetchRequest setPredicate:predicate];

    NSError *errorTotal = nil;
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:&errorTotal];

    if (errorTotal) {
        NSLog(@"fetch board error. error:%@", errorTotal);
    }

    return [results count];

    [fetchRequest release];
    [results release];
}

2 个答案:

答案 0 :(得分:1)

您需要修改指定的“UITableViewDataSource”对象,以便为"numberOfSectionsInTableView:"方法返回“2”。

然后,您需要在"tableView:cellForRowAtIndexPath:"方法中返回正确的内容,具体取决于索引路径中指定的部分。

如果您想要一个可选的章节标题(例如“历史记录”或“最新”),您还可以通过sectionIndexTitlesForTableView:返回一系列章节标题。

答案 1 :(得分:1)

实施- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 2;
} 

这样tableviewController知道要创建多少个部分。如果您没有实现此方法,它将创建默认的节数,即1。

  

此方法要求数据源返回表视图中的节数。

     

默认值为1。

可以找到完整的方法说明here

更新

当tableview询问您为某个索引路径显示哪个单元格时,您可以为该单元格提供正确的数据。假设您有2个NSArray包含最新和历史行的标题,您可以执行以下操作:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    //create cell
    static NSString *CellIdentifier = @"MyCellIdentifier";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if(indexPath.section == 0){
        //set title for latest
        NSString *title = [[self latestTitles] objectAtIndex:indexPath.row];
        [[cell textLabel] setText:title];
    }else{
        //set title for history
        NSString *title = [[self historyTitles] objectAtIndex:indexPath.row];
        [[cell textLabel] setText:title];
    }

    //Update: add NSLog here to check if the cell is not nil..
    NSLog(@"cell = %@", cell);

    return cell;
}