У меня довольно странная проблема.TableView отображает ячейки как раздел
Я пытаюсь отобразить ряд записей данных из CoreData в TableView. После разработки приложений iOS7 из iTunesU я использовал 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
уникален для каждой записи, что не имеет смысла иметь раздел для каждого, но неважно)
Что здесь происходит? При необходимости я могу предоставить больше кода, но я подумал, что это самое важное.
Спасибо за любой ввод!
Редактировать
Я на самом деле хочу иметь один раздел для каждой записи. То, что я на самом деле ищу, - группировать каждую метку времени (timeAtConnect
) на соответствующую дату. То есть 2015-01-30 12:00 и 2015-01-30 13:00 оба будут в соответствии с разделом 2015-01-30, предположительно, используя категории, но я никогда не получал эту работу. Я решил, что это будет первым шагом для определения ошибки.
Я также просто подумал; когда я инициализирую NSFetchedResultsController и соответствующий NSSortDescriptor, сортирую timeAtConnect
по убыванию. Это я не укажу с sectionNameKeyPath
при инициализации NSFetchedResultsController. Я считаю, что эти два человека должны создавать одну и ту же сортировку. Как бы вы указали нисходящий порядок для раздела? (Я хочу, чтобы последние записи отображались вверху).
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];
}
Edit 2
Я просто заметил, что на самом деле не добавляются записи. Некоторые из записей исчезают. Из журналов отладки я вижу, что NSFetchedResultsController возвращает количество отображаемых разделов, т. Е. Это не что-то связано с UITableView, а скорее с NSFetchedResultsController.
up проголосовали так, чтобы у вас хватило репутации, чтобы вставить свой скриншот. (Теперь иди, пожалуйста ...) –
Можете ли вы показать свои методы 'UITableViewDataSource' /' UITableViewDelegate'? – mbm29414
Спасибо за голосование. Embedded.Добавлены методы. –