谁知道为什么这根View Controller's viewDidLoad正以推出所谓的两次?它的驾驶我坚果!

这里通过viewDidLoad是从第一次堆栈跟踪:

#0  0x0000276a in -[RootViewController viewDidLoad] at RootViewController.m:71
#1  0x3097548f in -[UIViewController view]
#2  0x00002734 in -[RootViewController initWithCoder:] at RootViewController.m:39
#3  0x30ab5ce4 in -[UIClassSwapper initWithCoder:]
#4  0x30514636 in _decodeObjectBinary
#5  0x30514035 in _decodeObject
#6  0x30ab5a1d in -[UIRuntimeConnection initWithCoder:]
#7  0x30514636 in _decodeObjectBinary
#8  0x30515f27 in -[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]
#9  0x305163b0 in -[NSArray(NSArray) initWithCoder:]
#10 0x30514636 in _decodeObjectBinary
#11 0x30514035 in _decodeObject
#12 0x30ab4dde in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:]
#13 0x30ab6eb3 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:]
#14 0x308f85f1 in -[UIApplication _loadMainNibFile]
#15 0x30901a15 in -[UIApplication _runWithURL:sourceBundleID:]
#16 0x308fef33 in -[UIApplication handleEvent:withNewEvent:]
#17 0x308fad82 in -[UIApplication sendEvent:]
#18 0x309013e1 in _UIApplicationHandleEvent
#19 0x32046375 in PurpleEventCallback
#20 0x30245560 in CFRunLoopRunSpecific
#21 0x30244628 in CFRunLoopRunInMode
#22 0x308f930d in -[UIApplication _run]
#23 0x309021ee in UIApplicationMain
#24 0x000022e4 in main at main.m:14

和所述第二时间:

#0  0x0000276a in -[RootViewController viewDidLoad] at RootViewController.m:71
#1  0x30ab50cd in -[UINib instantiateWithOptions:owner:loadingResourcesFromBundle:]
#2  0x30ab6eb3 in -[NSBundle(NSBundleAdditions) loadNibNamed:owner:options:]
#3  0x308f85f1 in -[UIApplication _loadMainNibFile]
#4  0x30901a15 in -[UIApplication _runWithURL:sourceBundleID:]
#5  0x308fef33 in -[UIApplication handleEvent:withNewEvent:]
#6  0x308fad82 in -[UIApplication sendEvent:]
#7  0x309013e1 in _UIApplicationHandleEvent
#8  0x32046375 in PurpleEventCallback
#9  0x30245560 in CFRunLoopRunSpecific
#10 0x30244628 in CFRunLoopRunInMode
#11 0x308f930d in -[UIApplication _run]
#12 0x309021ee in UIApplicationMain
#13 0x000022e4 in main at main.m:14
有帮助吗?

解决方案

怪异。我还没有看到这种特殊情况,但在一般情况下,你应该假设viewDidLoad中可以多次调用。每当引用该控制器笔尖文件被加载,它会被调用。

有关一个简单的应用程序仅具有一个笔尖,这应该不会发生。但是,在一个更复杂的应用程序,可以装载和卸载视图控制器,这种情况发生的所有时间。

其他提示

我有同样的问题,当我的应用程序是第一次下水。我发现,在我的MainWindow.xib文件,我设置我的两个应用程序委托的viewController出口,我的窗口的rootViewController出口到我的根视图控制器。当你在Xcode中创建一个视图根据项目文件,应用程序委托的didFinishLaunchingWithOptions将预先填入:

self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;

我相信self.viewController伊娃从MainWindow.xib中实例化didFinishLaunchingWithOptions之前调用。那么,上述预填充代码设置窗口的rootViewController。所以,如果,中联,您可以指定你的MainWindow.xib文件窗口中的rootViewController出口,你的根视图控制器将实际创建两次,并添加窗口的根视图控制器两次。

我做了一些调试,这里是我的发现对ViewController加载顺序:

initWithNibName:bundle:     self = <original instance>, retainedOutlet = 0x0  
loadView >>>                self = <original instance>, retainedOutlet = 0x0  
      initWithCoder:        self = <coder instance>,    retainedOutlet = 0x0  
      initWithCoder:        self = <coder instance>,    retainedOutlet = 0x0  
      setView:              self = <original instance>, retainedOutlet = 0x0  
      setRetainedOutlet:    self = <original instance>, retainedOutlet = 0x1613c40  
      viewDidLoad           self = <coder instance>,    retainedOutlet = 0x0  
      awakeFromNib          self = <coder instance>,    retainedOutlet = 0x0  
loadView <<<  
viewDidLoad                 self = <original instance>, retainedOutlet = 0x1613c40  
viewWillAppear:             self = <original instance>, retainedOutlet = 0x1613c40  
dealloc                     self = <coder instance>,    retainedOutlet = 0x0
viewDidAppear:              self = <original instance>, retainedOutlet = 0x1613c40

在的loadView方法,initWithCoder:被调用,在创建viewController的新副本。这就是被传递到几个方法(如viewDidLoad)。在副本中的dealloc调用后销毁。好消息是,在这个副本,保留网点没有配置,那么你可以使用它作为一个测试来了解你是否应该初始化变量,调用其他方法,最重要的是,如果你需要释放和销毁的dealloc中的对象。

关键外卖:真正viewController将具有构造成其保留IBOutlet性质。如果你是在越来越多次调用一个重写的方法,只是检查IBOutlet您保留NULL属性之一。如果它们NULL,然后立即返回。

任何人有任何线索,为什么发生这种情况这样?

侧的这种效果:可以不awakeFromNib可靠地使用

您不能承担的viewDidLoad将只调用一次。如果要初始化对象和想要保证执行初始化无论是在init()方法,或者如果您从awakeFromNib方法的榫文件加载。

我也有类似的问题,这是我的重命名XIB文件及其ViewController类(文件所有者)的结果。不这样做 - 因为它确实得到了意见和XML内misdefined代表,它是不可恢复的。同时,我只好到负载的引用,应该是我新的VC原来的VC。我认为,造成父重建本身,然后VC,我真的想调用。基本上,我创建了一个间接递归到具有在我的跟踪X2 viewDidLoad条目VC。

我不认为这是对X2 viewDidLoad任何正当的理由,因为它是一个起源与错误的假设前提条件才能调用其它初始化。每一个我所见过的X2 viewDidLoad中的时间,这是我的一个编码错误 - 很多时候,当我重构和走动VC类

如果有超过上viewDidLoad电话,请人(苹果开发你在听)解释它在技术细节的正当理由 - 我一直在寻找这个问题的答案了几个月

我有这个问题,但能够解决它。

<强>解决方案

重命名加载两次视图控制器类。

<强>详情:

重新命名,并做出新的名称全新的东西。 重命名文件不会停止负载两次的问题。创建一个新的项目(如由他人建议的)可能是矫枉过正,至少首先尝试简单的解决方案!重命名类目的地VC的。

<强>提示: 如果重命名类解决您的问题,那么你显然需要更新到该类所有引用。您可以通过使用命令+ SHIFT + F为项目范围内的发现加快这。

我遇到了同样的问题,因为我是从头开始重新设计ViewController摆脱XIB文件,并让类重用。我有这将收到一条ViewController消息和一个dealloc的消息,本次viewDidLoad实例。

我发现,这是在不loadView被重新定义的ViewController方法的结果。所谓loadView默认awakeFromNib,设置为类名nibName属性。尽管我已经删除从项目的XIB文件,它仍然在仿真器上的应用程序目录。

所以,即使你可以只重置内容和模拟器的设置,以摆脱第二viewDidLoad的,更好的方法可能是刚刚重新定义loadView这样的:

- (void)loadView {
    self.view = [[[UIView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]] autorelease];
    self.view.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin; 
}

这是有道理的,如果你考虑在UIViewController's视图属性的文档:

  

如果您访问此属性和其   值当前为零,该视图   控制器会自动调用   loadView方法并返回   所得视图。默认loadView   方法尝试从加载视图   与视图相关联的笔尖文件   控制器(如果有的话)。如果你的观点   控制器不具有相关联的   笔尖文件,你应该重写   loadView方法和使用它来创建   根视图和所有它的子视图的

在我的情况,我没有注意到,其实我已经分配RootViewController的两次:

application:didFinishLaunchingWithOptions: applicationDidBecomeActive:

我想补充这一点,如果你使用的是系统功能,如TouchID,然后点击 applicationWillResignActive 在您的AppDelegate将被调用,如果你是说,重置控制器的安全控制器的根,那么你得到重新调用,和 performSegueWithIdentifier(self.MAIN_SEGUE,发件人:个体经营)!,将不会触发

这发生在我身上时,我使用xibs构建视图合并项目从故事板的老路上。切换回的主要原因是事实,我不能妥妥提出了一个模式的看法。顺便我通常它是由具有从一个UIButton委托方法构造一个特定视图控制器的一个实例中,设置它的一些属性(最进口一个是代表这样我就可以正确地再次关闭该模态视图控制器),然后本的它在模式的方式。在新的故事板的方式,推测这是具有SEGUE完成。自定义转换只能通过使扩展了UIStoryboardSegue类的自定义类是可行的。我觉得这样太麻烦相比,它使用的是简单的方式,使我重新合并。

这是怎么使我有一个视图控制器负载两次?当传送从故事板项目到项目XIB的代码,我做了几个xibs的(每个视图控制器)和复制的对象的ViewController从故事板。这导致了在它不是一个VIW一个厦门国际银行,而是一个视图 - 控制;这意味着我必须把视图 - 控制在一个视图 - 控制(因为文件的所有者也是视图 - 控制的实例)。我不认为你的情况,你有这个问题,但我希望它或许可以帮助别人的一天。

要解决此移动从视图控制器视图出视图控制器和所述对象部分的根级别。这两个视图控制器,它的导航项目应予以删除。建立和运行,你可以看到只有一个视图控制器分配。这是文件的所有者。

如果你的代码没有访问时,它尚未加载视图属性,视图控制器将只创建空的观点,并可能引发意外view did load

最常见的错误是在初始化期间访问视图属性。可以是由厦门国际银行调用意外地访问视图属性一些属性访问器(setter方法)。

如果某些属性与IBInspectable注释,你应该有前检查isViewLoaded应用一些价值来查看。


-(void) setSomeProperty:(UIColor*) someColor
{
  _someColor = someColor;
  if(self.isViewLoaded) {
    // self.view causes view creation and invokes 'viewDidLoad' then the view is not ready yet.
    self.view.backgroundColor = someColor;
  }
}

-(void) viewDidLoad
{
  [super viewDidLoad]
  if(_someColor){
    self.view.backgroundColor = _someColor;
  }
}

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top