Почему [foo view] ведет себя не так, как foo.view в моем коде? - PullRequest
7 голосов
/ 28 марта 2012

Чисто случайно я обнаружил, что вызов [bar.view addSubview:[foo view]] не работает, но [bar.view addSubview:foo.view] работает в следующем коде.

foo=[fooViewController alloc] initWithNibName:@"fooViewController" andBundle:nil];
[self.view addSubview:foo.view];//here's where I swap the two commands out
[foo aFunctionThatSendsAMessageToOneOfFoosSubViews];

(Эта последняя строка объясняется тем, что foo имеет некоторые вложенные представления, которые необходимо настроить перед запуском, в частности, UIWebView. Если они не были созданы досообщение отправлено, сообщение заканчивается на nil. С foo.)

Я думал, что эти два функционально идентичны - что foo.view вызывает тот же геттер, что и [foo view], нона практике это не так;точечный синтаксис дает желаемые результаты, в то время как использование скобок приводит к отправке сообщения на номер nil.

Если бы вы спросили меня десять минут назад, я бы сказал, что разница между этими двумя выражениями была«Синтаксис и ничего больше».Учитывая, что я явно неправ, мне нужно понять, КАК я ошибаюсь, или я снова споткнусь об этом.

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Они функционально эквивалентны. Я думаю, что это условие гонки. При первом вызове foo.view в этом коде представление еще не загружено, и вызов отправляется на [foo loadView]. Вы не можете быть уверены, что представление загружено, пока не будет вызван [foo viewDidLoad] или foo.isViewLoaded == YES.

Вам нужно подождать, чтобы убедиться, что представление загружено, прежде чем выполнять какие-либо действия, основанные на нем, такие как [foo aFunctionThatSendsAMessageToOneOfFoosSubViews].

В вашем текущем случае иногда он загружается во времени, а иногда нет.

0 голосов
/ 28 марта 2012

если я не ошибаюсь, проблема в том, что [foo view] пытается вызвать метод с именем view (а если у вас его нет, возвращаемое значение равно nil)

с другой стороны вcase для foo.view, view является свойством класса

...