UITableView не показывает результаты, пока не выйдет и не откроется снова - PullRequest
0 голосов
/ 15 ноября 2011

Я использую NSFetchedResultsController для управления UITableViewList объектов Gift. Идея состоит в том, чтобы позволить пользователю добавлять подарки, нажав кнопку добавления на панели навигации. Кнопка добавления должна выдвинуть представление для настройки Gift в стеке navigationController. Затем, если пользователь фактически вводит данные в поле, он должен сохранить Подарок, чтобы, если пользователь открывает окно (т. Е. Переходит обратно в список), он увидел свой новый Подарок в списке. Достаточно просто. Проблема в том, что основной список не обновляется, пока я не перезагружу приложение. Полностью потерян.

Вызывается, когда пользователь нажимает кнопку «+» в главном табличном представлении (giftlistcontroller.m)

-(void) addgift{
    Gift *newGift = [NSEntityDescription insertNewObjectForEntityForName:@"Gift" inManagedObjectContext:self.managedObjectContext];
    GiftEditController *editController = [[GiftEditController alloc] initWithStyle:UITableViewStyleGrouped];
    editController.gift = newGift;

    [self.navigationController pushViewController:editController animated:YES];
    [editController release];
}

Затем в GiftEditController, если пользователь обновляет поле ...

- (void)textFieldDidEndEditing:(UITextField *)textField {
    if (textField == nameField) {
        gift.name = textField.text;
    } else if (textField == priceField) {
        gift.price = [NSNumber numberWithFloat:[textField.text floatValue]];
    } 

    NSError *error;
    if (![gift.managedObjectContext save:&error]) {
        NSLog(@"Couldn't save in textFieldDidEndEditing");
    }
}

Все стандартные методы делегата fetchedresultscontroller определены в giftlistcontroller. Полностью озадачен, и любые предложения будут очень (!!!!) признательны.

Ответы [ 3 ]

1 голос
/ 15 ноября 2011

Спасибо всем за вашу помощь.Я наконец нашел решение, и я подумал, что было бы разумно опубликовать его для кого-то еще с этой проблемой (простой поиск в Google заставляет думать, что их больше, чем несколько).

Вы были правы,Мне нужно было перезагрузить мой стол.Но этого было недостаточно.Проблема заключалась в том, что я только что добавил в шаблон fetchedResultsController код, который использует Apple, что в данном случае не работает.В частности, первые несколько строк fetchedResultsController читают:

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

    ....
}

Проблема в том, что даже если обновляется таблица, она все еще использует старый fetchedResultsController, который не знает о новой записи.Мне удалось исправить эту проблему, обновив fetchedResultsController в viewDidAppear :

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Set the fetched results controller to nil in case we are coming back
    // from a view that added or removed entries.
    self.fetchedResultsController = nil;

    NSError *error = nil;
    if (![[self fetchedResultsController] performFetch:&error]) {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button.
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    //reload the table to catch any changes
    [self.tableView reloadData];

}

Спасибо Джеймсу Вебстеру и Луи.Вы, ребята, спасатели.

1 голос
/ 15 ноября 2011

Я не вижу, чтобы вы где-нибудь перезагружали стол.Добавьте [myTableView reloadData]; к своему коду, чтобы таблица обновлялась без выхода из приложения.

0 голосов
/ 15 ноября 2011

UITableView переопределяет метод layoutSubviews UIView, поэтому он вызывает reloadData только при создании нового экземпляра UITableView или при назначении нового источника данных.Перезагрузка табличного представления очищает текущее состояние, включая текущий выбор.Однако если вы явно вызываете reloadData, он очищает это состояние, и любой последующий прямой или косвенный вызов layoutSubviews не вызывает перезагрузку.

[Источник]

Вкратце: вызовите [tableView reloadData] для принудительной перезагрузки

...