черный экран -супервизор отсутствует в представленииWillAppear

У меня есть приложение, созданное из шаблона приложения с вкладками. (АРК, iOS 4)

  • Есть несколько вкладок и на 2. вкладках есть кнопка viewcontroller.view (ViewCont2 ).
  • Эта кнопка загружает представление (ModalViewCont )другого контроллера представления с помощью метода presentModalViewController.
  • В ModalViewCont есть кнопка закрытия, которая вызывает команду rejectModalViewControllerAnimated.
  • В viewDidDisappear ViewCont2 я устанавливаю для self.view = nil и других выходов значение nil, чтобы выгрузить представление, чтобы оно было загружено заново в следующий раз, когда оно появится на экране. Я делаю это, потому что он наследуется от базового класса (BaseViewCont ), который инициализирует некоторые общие свойства контроллера представления и добавляет некоторые кнопки, метки и т. д. в методе viewDidLoad. Таким образом, ViewControllers, которые наследуют от этого базового класса, могут по-разному настраивать эти свойства по своему усмотрению в своем методе viewDidLoad.

Задача

Теперь, когда ModalViewCont на экране, нажатие кнопки «Домой», чтобы перевести приложение в фоновый режим, и после возврата приложения, закрытие ModalViewCont не возвращает представление ViewCont2, а черный экран с панелью вкладок внизу. То же самое происходит и без выставления приложения фон/передний план; если другие вкладки были нажаты до нажатия 2. вкладки.(РЕДАКТИРОВАТЬ:Это происходит, только если для self.view установлено значение nil в viewWillDisappear вместо viewDidDisappear.)

Я определил, что ViewCont2 загружает новое представление (, проверил его ссылку ), но суперпредставление равно нулю, поэтому новое представление не отображается, а отображается черный экран.

Вещи, которые не сработали

  • Использование [self.view removeFromSuperview]; перед установкой self.view=nil,
  • В viewWillAppear добавление представления родителю; [self.parentViewController.view addSubview :self.view]; Этот не работал плавно, вид был немного выше экрана. Это связано с тем, что в иерархии есть несколько других суперпредставлений.

Решения, которые я рассматривал;

  • 1 -Если superview равен нулю в viewDidLoad, он становится доступным в viewWillAppear(предположение). Таким образом, метод viewWillAppear класса ViewCont2 можно использовать для правильной загрузки суперпредставления следующим образом:

_

if (self.view.superview == nil)
{
    self.tabBarController.selectedViewController = nil;
    self.tabBarController.selectedViewController = self;
}
  • 2 -Вместо этого для инициализации можно использовать метод базового класса viewWillAppear, поэтому нет необходимости выгружать представление. Таким образом, производительность может быть оптимизирована, она не будет выгружаться каждый раз, когда представление исчезает. Кроме того, было бы лучше выполнить инициализацию только один раз, проверив флаг, а не выполнять ее каждый раз, когда он появляется.

Вопросы

  • 1 -Почему не восстанавливается супервизор? Что я должен сделать для этого? (Это основная проблема, которую я хочу понять и решить вместо того, чтобы пробовать альтернативы...)
  • 2 -Я делаю что-то неправильно, назначая nil для просмотра для его выгрузки? Если да, то как мне правильно выгрузить представление в таком случае, как это (приложение с вкладками )?
  • 3 -Что-то не так с 1. решением ? Это похоже на кладж? Верно ли это предположение о superview и viewWillAppear ?

РЕДАКТИРОВАТЬ:Кажется, что когда viewDidLoad вызывается раньше, чем должно (, т. е. когда представление обнулено в viewWillDisappear вместо viewDidDisappear ), суперпредставление не установлено.

8
задан tshepang 10 April 2014 в 03:36
поделиться