Window的rootViewController属性时view

Window的rootViewController属性时view

本文介绍了为什么在设置UIWindow的rootViewController属性时viewDidLoad被调用了两次?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

已经有几个类似的问题,但它与我的情况并不完全相同。只需启动一个新的基于视图的项目,使用NSLog语句添加 viewDidLoad awakeFromNib 并在<$ c中执行以下更改$ c> MainWindow.xib :

There were already a couple of similar questions, but it wasn’t exactly the same as in my case. Just start a new view based project, add viewDidLoad and awakeFromNib with NSLog statements and do the following changes in MainWindow.xib:


  • 删除应用程序代理中的视图控制器连接。

  • 连接 UIWindow的 rootViewController 委托给App View Controller实例。

  • Remove the view controller connection in the application delegate.
  • Connect UIWindow’s rootViewController delegate to the App View Controller instance.

第一次通话时的堆栈跟踪:

The stack trace from the first call:

#0     0x000025c0 in -[foozaViewController viewDidLoad] at /Users/rafael/Downloads/fooza/fooza/foozaViewController.m:38
#1     0x000cd089 in -[UIViewController view] ()
#2     0x00040d42 in -[UIWindow addRootViewControllerViewIfPossible] ()
#3     0x0079d5e5 in -[NSObject(NSKeyValueCoding) setValue:forKey:] ()
#4     0x00050ff6 in -[UIView(CALayerDelegate) setValue:forKey:] ()
#5     0x0021930c in -[UIRuntimeOutletConnection connect] ()
#6     0x00d418cf in -[NSArray makeObjectsPerformSelector:] ()
#7     0x00217d23 in -[UINib instantiateWithOwner:options:] ()
#8     0x00219ab7 in -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] ()
#9     0x0001f17a in -[UIApplication _loadMainNibFile] ()
#10     0x0001fcf4 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] ()
#11     0x0002a617 in -[UIApplication handleEvent:withNewEvent:] ()
#12     0x00022abf in -[UIApplication sendEvent:] ()
#13     0x00027f2e in _UIApplicationHandleEvent ()
#14     0x01004992 in PurpleEventCallback ()
#15     0x00dac944 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#16     0x00d0ccf7 in __CFRunLoopDoSource1 ()
#17     0x00d09f83 in __CFRunLoopRun ()
#18     0x00d09840 in CFRunLoopRunSpecific ()
#19     0x00d09761 in CFRunLoopRunInMode ()
#20     0x0001f7d2 in -[UIApplication _run] ()
#21     0x0002bc93 in UIApplicationMain ()
#22     0x000020d9 in main ()

这是第二次调用的跟踪:

And here’s the trace from the second call:

#0     0x000025c0 in -[foozaViewController viewDidLoad] at /Users/rafael/Downloads/fooza/fooza/foozaViewController.m:38
#1     0x00002555 in -[foozaViewController awakeFromNib] ()
#2     0x00217f26 in -[UINib instantiateWithOwner:options:] ()
#3     0x00219ab7 in -[NSBundle(UINSBundleAdditions) loadNibNamed:owner:options:] ()
#4     0x0001f17a in -[UIApplication _loadMainNibFile] ()
#5     0x0001fcf4 in -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] ()
#6     0x0002a617 in -[UIApplication handleEvent:withNewEvent:] ()
#7     0x00022abf in -[UIApplication sendEvent:] ()
#8     0x00027f2e in _UIApplicationHandleEvent ()
#9     0x01004992 in PurpleEventCallback ()
#10     0x00dac944 in __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ ()
#11     0x00d0ccf7 in __CFRunLoopDoSource1 ()
#12     0x00d09f83 in __CFRunLoopRun ()
#13     0x00d09840 in CFRunLoopRunSpecific ()
#14     0x00d09761 in CFRunLoopRunInMode ()
#15     0x0001f7d2 in -[UIApplication _run] ()
#16     0x0002bc93 in UIApplicationMain ()
#17     0x000020d9 in main ()



方式将插座连接到
应用程序委托中的根视图控制器,以保持理智的 viewDidLoad / viewDidUnload 比率
或者我们应该忽略Apple的规则而不要在 awakeFromNib 中调用super并使用新的 rootViewController 属性 UIWindow

Is this desired behavior or a bug? Should we still use the more traditionalway of connecting an outlet to the root view controller in theapplication delegate to maintain a sane viewDidLoad/viewDidUnload ratioor should we ignore Apple’s rules and do not call super in awakeFromNib and use the new rootViewController property of UIWindow?

推荐答案

它看起来像一个bug,因为它只能在Xcode 4中重现。我会提交一个bug。

It looks like a bug, because it’s only reproducible in Xcode 4. I will file a bug.

另见(Apple开发者论坛)

See also http://shurl.at/5u (Apple Developer Forums)

这篇关于为什么在设置UIWindow的rootViewController属性时viewDidLoad被调用了两次?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 07:54