UITableViewController viewWillAppear - PullRequest
       2

UITableViewController viewWillAppear

1 голос
/ 28 мая 2011

У меня есть контроллер представления, который является подклассом UITableViewController. Вот мой viewWillAppear: анимированный метод:

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

    if (fetchedResultsController != nil) {
        [fetchedResultsController release];
        fetchedResultsController = nil;
    }

    [self.fetchedResultsController performFetch:nil];
    [self.tableView reloadData];
}

Я запутался, увидев доступ к fetchedResultsController при вызове [super viewWillAppear: animated]. Так как super является UITableViewController, и по сути нет анимированного метода viewWillAppear: для этого класса, тогда должен вызываться его суперкласс viewWillAppear: animated, верно? Если это правильно, то класс UIViewController не должен обращаться к методам делегатов UITableViewController. Но я вижу, что вызывается numberOfSectionsInTableView. Я не уверен, почему вызов super viewWillAppear: animated сделает это.

Поэтому, прежде чем я явно запустил peformFetch и reloadData, таблица заполняется. В то время данные, которые он заполняет, устарели.

Вот код выбранного контроллера результатов

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

    NSFetchRequest *fetchRequest = ...
    NSEntityDescription * entity = ...

    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:10];

    NSSortDescriptor *aSortDescriptor = ...
    NSSortDescriptor *bSortDescriptor = ...

    NSArray *sortDescriptors = ...
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = ...

    aFetchedResultsController.delegate = self;

    self.fetchedResultsController = aFetchedResultsController;

    [aFetchedResultsController release];
    [fetchRequest release];
    ...        
    [sortDescriptors release];

    NSError *error = nil;

    if (![fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved Error %@, %@", error, [error userInfo]);
        abort();
    } 

    return fetchedResultsController;

}

1 Ответ

1 голос
/ 28 мая 2011

Документация специально описывает это поведение:

Когда представление таблицы собирается появиться при первой загрузке, контроллер представления таблицы перезагружает данные представления таблицы.Он также очищает свой выбор (с анимацией или без нее, в зависимости от запроса) каждый раз, когда отображается представление таблицы.Класс UITableViewController реализует это в методе суперкласса viewWillAppear:.Вы можете отключить это поведение, изменив значение в свойстве clearsSelectionOnViewWillAppear.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...