Добавление представления с presentModalViewController - PullRequest
2 голосов
/ 19 июля 2009

У меня есть подкласс UIViewController, называемый TripViewController. Этот класс имеет следующий метод:

- (void)lockScreen {
  LockOverlay *lockOverlay = [[LockOverlay alloc] init];
  [self presentModalViewController: lockOverlay animated:YES];
}

LockOverlay также является подклассом UIViewController, определяемым следующим образом (остальная часть кода является просто автоматически генерируемыми заглушками):

// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
  CGRect frame = CGRectMake(0, 0, 225, 37);
  UIImageView *sliderBackground = [[UIImageView alloc] initWithFrame:frame];      
  sliderBackground.image = [UIImage imageNamed:@"slider-bar.png"];  
  UIImageView *unlock = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"unlock.png"]];
  [sliderBackground addSubview:unlock];
  frame = CGRectMake(10, 360, 225, 37);
  Slider *slider = [[Slider alloc] initWithFrame:frame];
  [slider addSubview:sliderBackground];
  slider.unlock = unlock;
  [self.view addSubview:slider];
}

Когда вызывается lockScreen, программа входит в бесконечный цикл, и loadView вызывается снова и снова.

Итак, что я здесь не так делаю? У меня раньше была такая ошибка ... В App Delegate я создаю TabBarController, и в одном из представлений есть NavigationController. Я получил такую ​​же ошибку, когда попытался добавить View вместо NavigationViewController в массив tabBar. Я предполагаю, что эта проблема похожа, и я не толкаю новый ViewController в нужное место, но это только предположение.

Ответы [ 2 ]

0 голосов
/ 13 августа 2010

до

[self.view addSubview:slider];

у вас должно быть что-то вроде

self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];

Это потому, что self.view еще не существует ... для этого предназначен loadView! В документе UIViewController задокументировано, что реализация свойства представления заключается в том, что при обращении к нему (с назначенным) и до сих пор оно равно nil, он вызывает loadView, чтобы сначала создать представление. Ваш loadView предполагал, что представление существует, и пытался добавить подпредставление, в результате которого контроллер представления снова вызывал loadView.

Переопределение loadView всегда должно присваивать self.view некоторому виду, который заполняет экран.

0 голосов
/ 19 июля 2009

Я изменил loadView на initWithFrame и вернул self. Это работает сейчас.

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