views:

483

answers:

2

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"

In my AppDelegate applicationDidFinishLaunching, I do this:

  1. [window makeKeyAndVisible]
  2. [window addSubView:a.view];
  3. create a view controller "d"
  4. create a navigationController "e" with rootviewcontroller "d"
  5. 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.)

+3  A: 

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.

Noah Witherspoon
Marked this as an answer as the explanation makes sense. Still getting some crashes with animations (no crashes without them), but probably due to some other unrelated strangenesses in my code.
Jaanus
+3  A: 

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.

Ron Srebro