我刚刚升级到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中的一个新设置导致了这个改变,或者如果我将不得不重写它来做我需要的东西办?
答案 0 :(得分:2)
您无法知道何时会调用viewDidLoad
,viewWillAppear
等。
我的建议:为控制器创建一个专用的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