Обновить UINavigationController? - PullRequest
1 голос
/ 05 мая 2011

У меня есть UINavigationController с двумя ViewControllers в стеке. В определенный момент выполнения программы второй контроллер представления виден на экране, и в этот момент я хотел бы заменить этот ViewController другим. Тем не менее, это не работает. Вот мой код:

UINavigationController * thisNavController = self.waitingController;

// remove the Dummy and set the new page instead
NSMutableArray * newControllers = [NSMutableArray arrayWithArray: thisNavController.viewControllers];
[newControllers replaceObjectAtIndex: ([thisNavController.viewControllers count] - 1) withObject: page];
NSLog (@"visible before: %@", [thisNavController.visibleViewController description]);
[thisNavController setViewControllers: [NSArray arrayWithArray: newControllers] animated: YES];
NSLog (@"visible after: %@", [thisNavController.visibleViewController description]);
[thisNavController.visibleViewController.view setNeedsDisplay];

Приведенный выше код производит этот вывод:

2011-05-05 13:30:22.201 myApp[3286:207] visible before: <DummyViewController: 0x4c8b4c0>
2011-05-05 13:30:22.209 myApp[3286:207] visible after: <RealViewController: 0x60173f0>

Но то, что показано на экране, не меняется. Кажется, что все работает хорошо после того, как я переключаю вкладки, поэтому кажется, что это проблема перерисовки, но setNeedsDisplay ничего не делает, и я не смог найти метод, который сообщает NavigationController, что его viewControllers изменились.

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

Ответы [ 2 ]

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

Одним из решений было бы добавить 2 (начальных) контроллера вида, когда ваше приложение запущено, и разрешить навигацию только со 2-го и 3-го из них, возвращаясь к 1-му (корневому) контроллеру представления в вашем описанном senario.Вы никогда не разрешаете навигацию назад к этому 1-му контроллеру представления или от этого 1-го контроллера представления ко 2-му;Вы видите такое поведение в некоторых приложениях Apple, таких как iTunes и Remote - если нет подключения к сети, приложение сразу отображает представление без сетевого подключения.

Итак, когда вы хотите показать контроллер первого видавыше, вы делаете что-то вроде:

NSArray *array = [navigationController popToRootViewControllerAnimated:NO];

Без дополнительной информации о поведении навигации вашего приложения, я надеюсь, это поможет.

Или показать контроллер модального вида ?

0 голосов
/ 05 мая 2011

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

Сначала сохраните (возможный) делегат, установите текущий объект в качестве делегата, установите флаг, что анимация выполняется, и нажмите новый контроллер:

self.oldNavigationControllerDelegate = self.waitingController.navigationController.delegate;
self.waitingController.navigationController.delegate = self;
self.isAnimating = YES;
[viewController.navigationController pushViewController: [[DummyViewController alloc] init] animated: YES];

Затем реализуйте методы протокола UIViewControllerDelegate следующим образом:

#pragma mark -
#pragma mark UINavigationControllerDelegate methods

- (void) navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController == self.waitingController.navigationController)
        self.isAnimating = YES;
}

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    if (navigationController == self.waitingController.navigationController) {
        self.isAnimating = NO;
        if (self.readyPage != nil)
            [self pageIsReady: self.readyPage]; // method to load the ready controller
    }
}

После этого всякий раз, когда ваш контент / контроллер / загрузка / все, что готовы, убедитесь, что контроллер навигации больше не анимирует.Если это так, установите флаг, что страница готова.Если это не так, загрузите страницу:

if (self.isAnimating)
    self.readyPage = controller;
else
    [self pageIsReady: controller];

И, конечно же, осуществите фактическую загрузку нового стека (как обычно):

- (void) pageIsReady: (UIViewController *) page {
    // this method should replace the dummy that is spinning there

    UINavigationController * thisNavController = self.waitingController.navigationController;

    // remove the Dummy and set the new page instead
    NSMutableArray * newControllers = [NSMutableArray arrayWithArray: thisNavController.viewControllers];
    [newControllers replaceObjectAtIndex: ([thisNavController.viewControllers count] - 1) withObject: page];
    thisNavController.viewControllers = [NSArray arrayWithArray: newControllers];
    thisNavController.delegate = self.oldNavigationControllerDelegate; // restore the original delegate

    // clean up
    self.isAnimating = NO;
    self.readyPage = nil;
    self.waitingController = nil;
    self.oldNavigationControllerDelegate = nil;
}

Это делает всех счастливыми: P

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