viewDidAppear: not firing under certain conditions?
I have the following items in my app nib:
- the usual: file's owner, first responder window, delegate
- View Controller "a"
- View "b"
- UIScrollView "c"
- some other stuff in "b"
- View "b"
In my AppDelegate applicationDidFinishLaunching, I do this:
- [window makeKeyAndVisible]
- [window addSubView:a.view];
- create a view controller "d"
- create a navigati开发者_如何学JAVAonController "e" with rootviewcontroller "d"
- invoke [c addSubView:e.view]
Question/problem: when I do all of the above, viewDidAppear: is not firing for "d". (but viewDidLoad IS firing.) How do I find out why it is not firing, and fix it so that it would fire?
(Why I want to use viewDidAppear: the above involves some chained animations and viewDidAppear looks like a good place for a view controller to know when its view has been loaded and animated, so it can trigger subsequent animations.)
Usually when you're manually screwing with the view hierarchy you won't get -viewWillAppear:
, -viewDidAppear
, etc.; they're called by various SDK methods, like -pushViewController:animated:
, -presentModalViewController:animated:
, and by UITabBarController
when a tab gets selected.
When you add a view to the hierarchy yourself, it may or may not be onscreen or going-to-be-onscreen; the -addSubview:
method doesn't make any assumptions about your intentions. Just call 'em yourself as you add the view.
The first thing you should be aware of is that viewDidAppear is a method of UIViewController and not of UIView, it really has nothing to do with views.
The second thing is that there can only be one "active" UIViewController at a time.
When you add "a"'s view to the window it becomes the active UIViewController and only "a" will receive the viewDidAppear message while "e" won't actually be getting any UIViewContoller related methods (viewDidAppear, viewWillAppear etc.)
As @Noah mentioned when you use pushViewController you will receive these messages because the method causes the pushed view Controller to become the "active" UIViewController.
My suggestion for you is that if you create controllers for views that are subviews don't subclass UIViewController but rather NSObject, it will reduce your confusion level as you won't expect to get your UIViewController methods called which they won't anyway.
I had a similar issue when I set the delegate of my navigation controller. So in my UINavigationControllerDelegate methods, I did something like this:
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
//do something here
[viewController viewWillAppear:animated];
}
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
[viewController viewDidAppear:animated];
}
精彩评论