Purely by accident I discovered that calling [bar.view addSubview:[foo view]]
doesn't work, but [bar.view addSubview:foo.view]
does in the following code.
foo=[fooViewController alloc] initWithNibName:@"fooViewController" andBundle:nil];
[self.view addSubview:foo.view];//here's where I swap the two commands out
[foo aFunctionThatSendsAMessageToOneOfFoosSubViews];
(That last line is because foo
has some sub-views that need to be set up prior to running -- notably, a UIWebView
. If they haven't been instantiated before the message is sent, the message winds up going to nil
. With foo
.)
I thought these two were functionally identical -- that foo.view
calls the same getter that [foo view]
does, but in practice that's not the case; the dot syntax gets the desired results, while using the brackets winds up sending the message to nil
.
If you'd asked me ten minutes ago, I would have told you the difference between the two expressions was 'syntax, and nothing else'. Given that I'm clearly wrong, I need to understand HOW I'm wrong or I'm going to stumble over it again.
They are functionally equivalent. I think this is a race condition. When you first call foo.view
in that code, the view is not loaded yet, and a call is sent to [foo loadView]
. You can't be sure that the view is loaded until [foo viewDidLoad]
is called or foo.isViewLoaded == YES
.
You need to wait make sure the view is loaded before performing any actions that rely on it, such as [foo aFunctionThatSendsAMessageToOneOfFoosSubViews]
.
In your current case, sometimes it is loading in time and sometimes it isn't.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With