Первую строку не показывают, после вставляют операцию, сохраняют мои волосы

У меня есть ситуация здесь и потеря моих волос...

Очень простое приложение, управляемое базовыми данными, которые имеют контроллер табличного представления с, добавляет кнопку навигации. Это очень похоже на образец Рецептов с различиями в паре

  • Существует только единственный Объект в модели с 2 атрибутами
  • Ячейка в основной таблице не настраивается, с помощью значения по умолчанию textLabel

Базовая часть данных прекрасна, так как новая запись добавляется к базовой системе хранения и получила выбранный контроллер результатов использования. Проблема возникает, когда я добавляю новый объект, который будет помещен в верхнюю часть списка. Это может быть, например, новым объектом в пустом списке или объектом с порядком сортировки, берущим его к вершине. Объект, который помещается в вершину, не видим! Ячейка там с нулевой текстовой меткой, однако, я ясно видел, что выбранный контроллер результатов выпустил уведомление об обновлении, и я настроил ячейку, обновляющую с новым текстом.

Единственным путем я могу сделать ту ячейку, которую покажут, таблица данных прокрутки для вызова cellForRowAtIndexPath, затем текст элемента обновляется. Я добавляю другой объект, который будет помещен в вершину, снова новый текст элемента не видим. Я добавляю некоторый объект, который будет находиться в нижней части - без проблем, текст в ячейке видим. Также первоначально, когда я просто запускаю приложение нет никакой проблемы, все объекты видимы.

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

UPD:

- (void)configureCell:(UITableViewCell *)cell 
        atIndexPath:(NSIndexPath *)indexPath 
{
    Word* word = (Word*)[fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = word.word;
    printf("configureCell: %d : \"%s\"\n", indexPath.row,
           [word.word cStringUsingEncoding:NSASCIIStringEncoding]);
}

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

    UITableViewCell *cell = [tableView
                      dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[[UITableViewCell alloc]
                              initWithStyle:UITableViewCellStyleDefault
                              reuseIdentifier:CellIdentifier] autorelease];
    }

    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller 
{
[self.tableView beginUpdates];
}

- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller 
{
[self.tableView endUpdates];
}

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;

switch(type) {
          case NSFetchedResultsChangeInsert:
        printf("didChangeObjectAtRow: %d: insert\n", newIndexPath.row);
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeDelete:
        printf("didChangeObjectAtRow: %d : delete\n", indexPath.row);
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;

    case NSFetchedResultsChangeUpdate:
        printf("didChangeObjectAtRow: %d : update\n", indexPath.row);
        [self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
        break;

    case NSFetchedResultsChangeMove:
        printf("didChangeObjectAtRow: %d / %d : move\n", indexPath.row, newIndexPath.row);
        [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
        [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
        break;
}
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{
        NSInteger count = [[fetchedResultsController sections] count];

        if (count == 0) 
        {
            count = 1;
        }
printf("number of sections: %d\n", count);
return count;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
        {
        NSInteger numberOfRows = 0;
        if ([[fetchedResultsController sections] count] > 0) 
{
    id <NSFetchedResultsSectionInfo> sectionInfo = [[fetchedResultsController sections] objectAtIndex:section];
    numberOfRows = [sectionInfo numberOfObjects];
}

printf("number of rows in sections: %d is %d\n", section, numberOfRows);
return numberOfRows;
}

- (NSFetchedResultsController*)fetchedResultsController
{
if(fetchedResultsController != nil)
    return fetchedResultsController;

// This is autoreleased as the name implies
NSEntityDescription* entity = [NSEntityDescription entityForName:@"Word" inManagedObjectContext:managedObjectContext];

NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];

NSSortDescriptor* sortByWordDescriptor = [[NSSortDescriptor alloc] initWithKey:@"word" ascending:YES];
NSArray* sortArray = [[NSArray alloc] initWithObjects:sortByWordDescriptor, nil];
[fetchRequest setSortDescriptors:sortArray];


NSFetchedResultsController* controller = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Hmm"];
controller.delegate = self;
self.fetchedResultsController = controller;

[fetchRequest release];
[sortByWordDescriptor release];
[sortArray release];
[controller release];

return fetchedResultsController;
}

- (void) add:(id)sender
{
WordzWordEditView *wordEditViewController = [[WordzWordEditView alloc] initWithNibName:@"WordzWordEditView" bundle:nil];
wordEditViewController.delegate = self;

Word* word = [NSEntityDescription insertNewObjectForEntityForName:@"Word" inManagedObjectContext:self.managedObjectContext];
wordEditViewController.word = word;

UINavigationController *editWordNavigationController = [[UINavigationController alloc] initWithRootViewController:wordEditViewController];

[self presentModalViewController:editWordNavigationController animated:YES];

[wordEditViewController release];
[editWordNavigationController release];

}

UPD: вывод

controllerWillChangeContent
didChangeObjectAtRow: 0: insert
controllerDidChangeContent
number of sections: 1
number of sections: 1
number of rows in sections: 0 is 2
cellForRowAtIndexPath: 0
configureCell: 0 : "(null)"
post configuring: "(null)"
controllerWillChangeContent
configureCell: 0 : "asd"
didChangeObjectAtRow: 0 : update with 'asd'
controllerDidChangeContent
number of sections: 1
number of sections: 1
number of rows in sections: 0 is 2
1
задан Pablo 7 July 2010 в 23:09
поделиться

3 ответа

Без исходного кода трудно определить, когда вы добавляете данные, вызываете ли вы

– insertRowsAtIndexPaths:withRowAnimation:

Если вы вызываете [self.tableview reloadData] после добавления данных, появляется ли

0
ответ дан 2 September 2019 в 23:13
поделиться

Вы приводите к неправильному типу. (ошибка копирования/вставки) Вы используете UITableViewCell в tableView:cellForRowatIndexPath

case NSFetchedResultsChangeUpdate:
    printf("didChangeObjectAtRow: %d : update\n", indexPath.row);
    [self configureCell:(RecipeTableViewCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
    break;

Replace:

[self configureCell:(RecipeTableViewCell *)[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];

With:

[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
0
ответ дан 2 September 2019 в 23:13
поделиться

Некоторые наблюдения:

Эта строка в методе действия:

Word* word = [NSEntityDescription insertNewObjectForEntityForName:@"Word" inManagedObjectContext:self.managedObjectContext];

... триггеры:

case NSFetchedResultsChangeInsert:
    printf("didChangeObjectAtRow: %d: insert\n", newIndexPath.row);
    [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
    break;

... до завершения диалога и перед Word managedObject имеет значение для своего атрибута word . Это создает пустую заполненную ячейку.

(Я зарегистрировал методы в приложении Recipie и получил:

2010-07-07 18:56:08.848 Recipes[53880:207] NSFetchedResultsChangeInsert:=<NSIndexPath 0x11286a0> 2 indexes [0, 0]
2010-07-07 18:56:22.872 Recipes[53880:207] NSFetchedResultsChangeUpdate=<NSIndexPath 0x11286a0> 2 indexes [0, 0]

... последовательно.)

Интересно, что вы не регистрируете NSFetchedResultsChangeInsert . Это заставляет меня думать, что чего-то не хватает. Возможно в вашем журнале.

Я думаю, что проблема на самом деле может быть вызвана использованием модального контроллера, используемого для изменения значения Word.word.Модальное представление не позволяет таблице отвечать на NSFetchedResultsChangeUpdate , когда это происходит, поэтому она сохраняет начальное нулевое значение до тех пор, пока вы не прокрутите страницу, что заставит ее перезагрузить ячейку из полученного контроллера результатов. Просто догадка.

Вы можете протестировать, вставив объект Word и затем изменив свойство word в коде без модального представления. Возможно, используйте таймер, чтобы дать небольшую задержку. Если это сработает, то проблема определенно связана с модальным представлением.

В противном случае, я думаю, вам следует позаботиться о том, чтобы регистрировать весь объект пути индекса, чтобы убедиться, что у вас нет какой-то дурацкости с разделами.

0
ответ дан 2 September 2019 в 23:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: