presentModalViewController, требующая много времени

У меня есть UINavigationController, а на UINavigationBar у меня есть кнопка. Когда я нажимаю эту кнопку, новый UINavigationController представляется в виде UIModalPresentationFormSheet. Это работает.

Но я понял, что презентация FormSheet довольно трудоемка. Я поместил два журнала в метод действия («start» и «finish», см. Код ниже), один в первом и один в последней строке. Время регистрации говорит мне, что для запуска этого кода требуется около 1,5-2 секунд.

Это метод Action, вызванный из UINavigationItem:

- (IBAction)addBtnPressed:(id)sender{ NSLog(@"start"); FooViewController *fooContr = [[FooViewController alloc] init]; fooContr.delegate = self; UINavigationController *navContr = [[UINavigationController alloc] initWithRootViewController:fooContr]; [fooContr release]; navContr.modalPresentationStyle = UIModalPresentationFormSheet; [self.navigationController presentModalViewController:navContr animated:YES]; [navContr release]; NSLog(@"finish"); 

}

Кажется, что линия

  [self.navigationController presentModalViewController:navContr animated:YES]; 

занимает 90% времени.

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

Предварительно FooViewController UINavigationController с помощью FooViewController поэтому, когда вы его представляете, он уже находится в памяти.

Вероятно, так много времени занимает загрузка экземпляра экземпляра FooViewController .

Вы можете заставить его загрузиться, сделав что-нибудь для этого. подобно

UIView *view = fooContr.view;

Вы должны сделать это до нажатия кнопки, на которой отображается модальный контроллер. В противном случае это, вероятно, будет иметь тот же эффект.

Проблема производительности должна быть navContrManAufn тем, что ваш navContrManAufn занимает время, чтобы создать себя. Что он выполняет при init?

Сведите к минимуму код, который у вас есть в вашем init в viewControllers, переместите код в viewDidLoad, где это возможно, или даже в viewDidAppear, если это необходимо (код, предназначенный для запуска только один раз, должен быть в viewDidload).