Как вы перезагружаете представление UIViewController из XIB после того, как из памяти вылетело предупреждение? - PullRequest
2 голосов
/ 29 февраля 2012

У меня есть контроллер представления iPhone, который инициализирован с помощью XIB.

Если представление контроллера представления не видимо, когда появляется предупреждение о памяти, оно устанавливает его в ноль (освобождая его).Но когда перекрывающееся представление отклоняется и очищенное представление снова становится видимым, Какао не перезагружает его из XIB;он просто создает пустой.Это оставляет пустой белый экран и неработающее приложение.

Документ Apple для метода loadView UIViewController говорит: «Если у контроллера представления есть связанный файл пера, этот метод загружает представление изnib-файл. Контроллер представления имеет связанный nib-файл, если свойство nibName возвращает ненулевое значение. "Поэтому я переопределил loadView , чтобы просто проверить nibName после инициализации контроллера, и nibName правильно.Поэтому последующие вызовы loadView должны быть перезагружены из XIB.Я проверил, что loadView вызывается снова после предупреждения о памяти.

ОБНОВЛЕНИЕ : После дополнительных испытаний и регистрации я определил, что после второго viewDidLoad вызов, IBOutlets представления не ноль.Поскольку я установил для них значение nil в viewDidUnload , я пришел к выводу, что представление действительно было перезагружено из XIB.Так почему же он отображается как белый экран?

Спасибо за понимание.

Вот viewDidLoad :

- (void)viewDidLoad
{
    [super viewDidLoad];

    _photoViewController = [[EGOSimplePhotoViewController alloc] initWithPhotoSource:_photoSource
                                                                      scrollView:bigImageScrollView
                                                                     enclosingView:photoSquare];
    _photoViewController.delegate = self;

    if(_progressHUD == nil)
    {
        if(self.navigationController.view != nil)
        {
            _progressHUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
        }
        else
        {
            _progressHUD = [[MBProgressHUD alloc] initWithView:self.view];
        }
    }

    // Add HUD to screen.
    if(self.navigationController.view != nil)
    {
        [self.navigationController.view addSubview:_progressHUD];
    }
    else
    {
        [self.view addSubview:_progressHUD];
    }

    [_progressHUD release];

    _progressHUD.labelText = @"Loading...";
    [_progressHUD show:YES];
}

И viewDidUnload :

- (void)viewDidUnload
{
    [_photoViewController release];
    [super viewDidUnload];
}

1 Ответ

1 голос
/ 29 февраля 2012

Механизм загрузки представления viewControllers после того, как предупреждение о памяти должно быть прозрачным для разработчика.вам не нужно ничего делать, чтобы заново создать представление.

Для виртуальных машин, загруженных с помощью nib, система заново создаст представление, и будет вызван viewDidLoad.Для VC, загруженных программно, loadView будет вызываться снова.

, и весь цикл повторяется до viewDidAppear: и вы снова видите представление.

ИСПОЛЬЗОВАНИЕ CASE:

UITabBarController (2 вкладкипредполагается)

Пользователь на вкладке 0 >> Переходит на вкладку 1 >> Вызывает предупреждение о памяти >> Все активные VC на UITabbarController получают предупреждение о памяти >> UITabBarController выгрузит представление Tab0 >> Tab0 получает viewDidUnload:

Когда пользователь переключается обратно на Tab 0, его представление будет создаваться с нуля, начиная с loadView ИЛИ viewDidLoad, как я уже сказал.

Если вы не получаете эти события, то ваша иерархия viewController испорчена.Может быть, вы просто добавили какое-то представление VC как subView к чему-то ИЛИ, может быть, ваш VC не подключен к окну ни напрямую, ни через какой-либо контроллер контейнера (UINavigation, UITabBarController и т. Д.) ИЛИ, возможно, вы попытались свернуть свой собственный containerController и испортили.

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

...