2015-01-29 3 views
0

У меня довольно странная проблема.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 уникален для каждой записи, что не имеет смысла иметь раздел для каждого, но неважно)

Что здесь происходит? При необходимости я могу предоставить больше кода, но я подумал, что это самое важное.

Спасибо за любой ввод!

TableView in iOS Simulator


Редактировать

Я на самом деле хочу иметь один раздел для каждой записи. То, что я на самом деле ищу, - группировать каждую метку времени (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.

+0

up проголосовали так, чтобы у вас хватило репутации, чтобы вставить свой скриншот. (Теперь иди, пожалуйста ...) –

+1

Можете ли вы показать свои методы 'UITableViewDataSource' /' UITableViewDelegate'? – mbm29414

+0

Спасибо за голосование. Embedded.Добавлены методы. –

ответ

0

Я не знаю полный контекст вашего приложения, но это должно решить непосредственную проблему, измените вторую последнюю строку, чтобы иметь sectionNameKeyPath всухую

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

Спасибо за указатель, но на самом деле я хочу, чтобы на этом месте был один раздел на запись. Извините, я не был слишком ясен об этом. –

0

я подозреваю, вы излишне реализован метод делегата

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

Этот метод не должен быть реализован, если у вас есть только 1 секция.

+0

Не знал этого. Спасибо, это помогло мне с другим вопросом! К сожалению, у меня недостаточно репутации для голосования. Тем не менее, я бы действительно хотел, чтобы один раздел на запись прямо сейчас. (Это будет продлен дальше по линии) –

Смежные вопросы