iOS7 / XCode5 - 立即调用“viewDidLoad”,而不是调用“presentViewController”时

时间:2013-09-23 08:54:37

标签: xcode4 ios7 viewdidload xcode5

我刚刚升级到XCode5和iOS7,现在我的应用程序已停止工作。

我正在基于当前视图的属性创建一个新视图,我需要在显示之前设置新视图的一些属性。

以前,我是这样做的: -

hqView *v = [[hqView alloc] initWithNibName:NULL bundle:NULL];
[v setProperty1:true];
[v setProperty2:false];

[self presentViewController:v animated:TRUE completion:NULL];

然后在视图控制器上触发了[viewDidLoad]方法,其中包含以下代码: -

if ([self property1])
{
 [list1 load]
}
else
{
 [list2 load]
}

但是现在[viewDidLoad]方法在创建视图时就会触发,这意味着我无法在调用[viewDidLoad]之前设置属性,因此无论我实际想要什么,它总是会加载list2。 / p>

问题是 - 这不是在iOS6下发生的,所以我想知道它是否是XCode5中的一个新设置导致了这个改变,或者如果我将不得不重写它来做我需要的东西办?

2 个答案:

答案 0 :(得分:2)

您无法知道何时会调用viewDidLoadviewWillAppear等。

我的建议:为控制器创建一个专用的init方法,例如:

@implementation hqView

- (instancetype)initWithProperty1:(BOOL)prop1 property2:(BOOL)prop2
{
   // uses default NIB
   self = [super initWithNibName:nil bundle:nil];
   if (self){
      [self setProperty1:prop1];
      [self setProperty2:prop2];  

   }
   return self;
}


@end

答案 1 :(得分:1)

在init方法之前调用的viewDidLoad方法上设置断点,您将能够看到导致viewDidLoad被调用的原因。你可能会发现它被调用,因为视图被其他一些代码引用。这通常发生在超类中(例如,如果你有一个UIViewController超类,它实现了视图控制器的通用功能)。例如,如果您不小心将新代码放入超类中的方法中访问的self.view中,例如 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 你会注意到这种行为。因此,请确保您没有在任何代码中访问该视图。 -rrh