I am presenting a view controller:
SCAAboutController2 *controller = [[SCAAboutController2 alloc] initWithNibName:nil bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
The device hangs for 3-4 seconds before presenting. I have attempted to diagnose this using Instruments, but it seems most of the time is spent in main
-
Here is the same profile but with System Libraries unhidden:
None of these messages are recognizable to me, so I'm not sure how to start debugging my performance issue.
I read elsewhere that I should check that the main code is executing on the main thread. However, the following change is not improving anything:
dispatch_async(dispatch_get_main_queue(), ^{
SCAAboutController2 *controller = [[SCAAboutController2 alloc] initWithNibName:nil bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];
[self presentViewController:navController animated:YES completion:nil];
});
I've quickly run out of ideas on how to progress. How might I investigate further, and/or what might be the root cause of the slow presentation?
Edit
Some confusing discoveries:
viewWillDisappear
of the presenting controller.Edit 2
I have discovered that the issues centers around a series of layout constraints I add in the main (presenting) controller. Specifically, I loop through some child controllers (of type teamController
) and add the constraint:
[self.browser addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:self.browser
attribute:NSLayoutAttributeWidth
multiplier:1
constant:0]];
There are only 10 child controllers. Also strange: I have no such issues if I use the following instead:
[self.browser.contentView addConstraint:[NSLayoutConstraint constraintWithItem:teamController.view
attribute:NSLayoutAttributeWidth
relatedBy:NSLayoutRelationEqual
toItem:nil
attribute:NSLayoutAttributeNotAnAttribute
multiplier:1
constant:200]];
I am still very confused as to why these constraints would cause the presentation of another modal to hang, and why one variation of the constraint behaves drastically differently to the other.
Not sure this was the original author's problem but here is something that solved a similar problem for me: I was trying to present a view from didSelectRowAtIndexPath
and I had to call deselectRowAtIndexPath
before. If this may help someone...