3

我刚刚升级到 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。

问题是 - 这在 iOS6 下没有发生,所以我想知道是否是 XCode5 中的一个新设置导致了这种变化,或者我是否必须重写它来做我需要它做的事情?

4

2 回答 2

2

你不知道什么时候viewDidLoad, viewWillAppear, etc... 会被调用。

我的建议:为您的控制器创建一个专用的 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
于 2013-09-23T10:27:30.417 回答
1

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

于 2013-09-30T17:05:29.933 回答