Как заставить контроллер представления запустить код обновления, когда он выводится на вершину стека представлений? - PullRequest
3 голосов
/ 08 февраля 2009

У меня есть viewController (Planner), который загружает два контроллера представления (InfoEditor и MonthlyPlan) при запуске приложения. MonthlyPlan скрыт за InfoEditor (под нагрузкой).

Итак, мой вопрос: когда я обмениваю InfoEditor на MonthlyPlan (MonthlyPlan переносится наверх), как мне обновлять данные в представлении MonthlyPlan? NSLog в viewDidLoad вызывается при запуске приложения (что имеет смысл.) NSLogs в viewDidAppear и viewWillAppear ничего не делают.

Есть идеи?

Спасибо!

- Добавление более подробной информации -

Я сам создаю иерархию представлений. Простой viewController, который просто загружает два других viewController. Два дочерних viewControllers загружаются одновременно (при запуске приложения). Для обмена двумя представлениями я использую этот код:

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];

Обмен мнениями в порядке. Часть, которая отсутствует, это просто способ сообщить подпредставлению, что вы впереди, обновить некоторые свойства.

Ответы [ 2 ]

5 голосов
/ 08 февраля 2009

Здесь не хватает деталей. Как вы «обмениваетесь» двумя взглядами?

Если вы использовали UINavigationController в качестве контейнера, тогда viewWillAppear / viewDidAppear будет вызываться всякий раз, когда вы нажимаете / извлекаете новый viewController. Эти вызовы выполняются самим UINavigationController. Если вы используете UINavigationController, убедитесь, что у вас есть правильные прототипы для этих функций.

- (void)viewWillAppear:(BOOL)animated

Если вы пытаетесь реализовать иерархию представлений самостоятельно, то вам, возможно, потребуется выполнить эти вызовы самостоятельно как часть активации / деактивации представлений. Со страницы SDK viewWillAppear;

Если представление принадлежит представлению контроллер добавлен в представление иерархия напрямую, вид контроллер не получит это сообщение. Если вы вставляете или добавляете вид в иерархию представлений, и она имеет просмотреть контроллер, вы должны отправить связанный контроллер представления это сообщение напрямую.

Обновление:

С новыми подробностями проблема ясна: это ситуация, когда вы должны отправлять сообщения об исчезновении / появлении самостоятельно, как это предлагается в SDK. Эти функции не вызываются автоматически, когда представления вставляются / удаляются / изменяются напрямую, они используются кодом более высокого уровня (например, UINavigationController), который обеспечивает поддержку иерархии.

Если вы подумаете о своем примере использования exchangeSubView, то ничего не исчезает, просто один вид оказывается полностью или частично покрывающим другой, в зависимости от их областей и непрозрачности.

Я бы предложил, чтобы, если вы хотите поменять местами представления, вы действительно удаляете / добавляете по мере необходимости и вручную отправляете уведомления viewWillAppear / viewWillDisappear на их контроллеры.

1022 * Е.Г. *

// your top level view controller
-(void) switchActiveView:(UIViewController*)controller animated:(BOOL)animated
{
    UIController* removedController = nil;

    // tell the current controller it'll disappear and remove it
    if (currentController)
    {
        [currentController viewWillDisapear:animated];
        [currentController.view removeFromSuperView];
        removedController = currentController;
    }

    // tell the new controller it'll appear and add its view
    if (controller)
    {
        [controller viewWillAppear:animated];
        [self.view addSubView:controller.view];
        currentController = [controller retain];
    }

    // now tell them they did disappear/appear
    [removedController viewDidDisappear: animated];
    [currentController viewDidAppear: animated];
    [removedController release];
}
0 голосов
/ 09 февраля 2009

Я бы просто добавил метод updataData для каждого подпредставления и вызывал его одновременно с выводом на передний план. Вам нужно будет добавить переменную в ваш корневой контроллер вида, чтобы отслеживать активный subView:

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
if (subView1IsActive) [subView1Controller updateData];
else [subView2Controller updateData];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...