纯粹是偶然的,我发现调用[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
。
如果你在十分钟前问过我,我会告诉你这两个表达式之间的区别是'语法,而不是别的'。鉴于我显然是错的,我需要了解我是怎么做错的,或者我会再次发现它。
答案 0 :(得分:3)
它们在功能上是等同的。我认为这是竞争条件。当您第一次在该代码中调用foo.view
时,视图尚未加载,并且会向[foo loadView]
发送呼叫。在调用[foo viewDidLoad]
或foo.isViewLoaded == YES
之前,您无法确定视图是否已加载。
您需要等待确保视图已加载,然后才能执行任何依赖该操作的操作,例如[foo aFunctionThatSendsAMessageToOneOfFoosSubViews]
。
在您目前的情况下,有时它会及时加载,有时则不加载。
答案 1 :(得分:-3)
如果我没有弄错,问题是[foo view]试图调用一个名为view的方法(如果没有它,则返回为零)
另一方面,在foo.view的情况下,view是类的属性