TableView将单元格显示为节

时间:2015-01-29 20:36:13

标签: ios objective-c uitableview core-data

我有一个相当特殊的问题。

我试图在TableView中显示来自CoreData的大量数据条目。在从iTunesU开发iOS7应用程序后,我使用了NSFetchedResultsController。初始化如下。

// Set up fetch results controller
// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Session" inManagedObjectContext:[SessionManager sharedSessionManager].context];
[fetchRequest setEntity:entity];

// Set the batch size to a suitable number.
[fetchRequest setFetchBatchSize:20];

// Sort using the timeAtConnect property.
// Do not sort ascending to allow for the latest session to appear on top.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timeAtConnect" ascending:NO];
[fetchRequest setSortDescriptors:@[sortDescriptor ]];

// Use the sectionIdentifier property to group into sections.
_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[SessionManager sharedSessionManager].context sectionNameKeyPath:@"timeAtConnect" cacheName:@"Root"];
_fetchedResultsController.delegate = self;

我的CoreData集中目前有4个条目。会发生的是,其中一个最终成为其他一个的节头,见图。 (注意:每个条目的每个timeAtConnect都是唯一的,对于每个条目都有一个部分是没有意义的,但没关系)

这里发生了什么?如有必要,我可以提供更多代码,但我认为这是最重要的。

感谢您的任何意见!

TableView in iOS Simulator


修改

我实际上想要每个条目有一个部分。我实际需要的是将每个时间戳(timeAtConnect)分组到相应的日期。即2015-01-30 12:00和2015-01-30 13:00都会在2015-01-30之下结束,大概是通过使用类别,但我从来没有这样做。我认为这是识别错误的第一步。

我也想过;当我初始化NSFetchedResultsController和相应的NSSortDescriptor时,我排序timeAtConnect 降序。我在NSFetchedResultsController的初始化时没有用sectionNameKeyPath指定。我相信这两个必须创建相同的排序。您如何指定该部分的降序? (我希望最新的条目显示在顶部)。

UITableViewDataSource

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    NSInteger count = [[self.fetchedResultsController sections] count];
    NSLog(@"Sections: %lu", (long) count);
    return count;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.fetchedResultsController sections] objectAtIndex:section];


    NSInteger count = [sectionInfo numberOfObjects];
    NSLog(@"Rows in section: %lu", (long)count);
    return count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    /*
     Use a default table view cell to display the event's title.
     */
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    Session *session = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    formatter.dateFormat = @"YYYY-MM-dd HH:mm";

    // Same key as was used for sectioning and sorting
    cell.textLabel.text = [formatter stringFromDate:session.timeAtConnect];

    NSLog(@"Accessed cell at index.");

    return cell;
}

-(NSString*) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {

    id <NSFetchedResultsSectionInfo> theSection = [[self.fetchedResultsController sections] objectAtIndex:section];

    NSLog(@"Accessed title for header in section %lu", (long unsigned)section);

    return theSection.name;
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    self.selectedSession = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NSLog(@"Selected session %@", self.selectedSession.timeAtConnect);

    [self performSegueWithIdentifier:@"moveToDetailedView" sender:self];
}

修改2

我刚注意到实际上并没有添加所有条目。一些条目消失了。从调试日志中我可以看到NSFetchedResultsController返回显示的部分数,即它与UITableView无关,而是与NSFetchedResultsController有关。

2 个答案:

答案 0 :(得分:0)

我不知道您的应用的完整上下文,但这应解决您的直接问题,更改第二行以使sectionNameKeyPath为nil

_fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[SessionManager sharedSessionManager].context sectionNameKeyPath:nil cacheName:@"Root"];

答案 1 :(得分:0)

我怀疑您已经不必要地实施了委托方法

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
   //her you count your dataset and return the count.
}

如果您只有1个部分,则不应该实施该方法。