1

我已经用完全相同的代码完成了很多次,但由于某种原因,它今天无法正常工作。

 ExampleViewController1 *exampleView = [[ExampleViewController1 alloc] initWithNibName:@"ExampleViewController1" bundle:nil];
 [exampleView setProjectName:[[self.projectListArray objectAtIndex:indexPath.row] objectForKey:@"name"]];
 NSLog(@"%@", [[self.projectListArray objectAtIndex:indexPath.row] objectForKey:@"name"]);
 XAppDelegate.stackController pushViewController:exampleView fromViewController:nil animated:YES]

我的NSLog打印正确。

My ExampleViewController1.h文件声明如下:

@property(nonatomic, strong) NSString *projectName; 

然后我在ExampleViewController1.m's中执行此代码

 -(void)viewDidLoad {
     NSLog(@"%@", self.projectName);
     self.projectNameLabel.text = self.projectName;
     [super viewDidLoad];
 }

NSLog的结果很好奇。NSLog来自我的似乎viewDidLoad在我的另一个之前被调用:

 2012-04-22 10:59:41.462 StackedViewKit[43799:f803] (null)
 2012-04-22 10:59:41.463 StackedViewKit[43799:f803] NewTest

我已经确认那里的(null)值来自NSLog(@"%@", self.projectName);,但这应该是第二个NSLog调用...我不知道为什么它首先通过。

有人要求此代码:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
   if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) {

    // random color
    self.view.backgroundColor = [UIColor colorWithRed:((float)rand())/RAND_MAX green:((float)rand())/RAND_MAX blue:((float)rand())/RAND_MAX alpha:1.0];
   }
  return self;
}
4

2 回答 2

2

viewDidLoad 在第一次显示视图控制器之前调用,而不是在 initWithNibName 之后立即调用。

> viewDidLoad 方法在视图控制器将其视图层次加载到内存后调用。无论视图层次结构是从 nib 文件加载还是在 loadView 方法中以编程方式创建,都会调用此方法。

> initWithNibName 您指定的 nib 文件不会立即加载。它在第一次访问视图控制器的视图时加载。如果您想在加载 nib 文件后执行其他初始化,请覆盖 viewDidLoad 方法并在那里执行您的任务。

您可以使用 App 委托将数据从一个传递到另一个,这是另一种替代解决方案。

you do in initWithNibName method itself. or in viewDidAppear.

根据@sch评论,您的 initWithNibName 方法应该是这样的;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 

     self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil] //just set it here first and then check

     if (self) { 
         // do something here; 
         } 
return self; 
}

我们只需要足够聪明地考虑在构造函数中我们需要什么以及在 viewDidLoad 中我们需要什么(一旦它加载到内存中)

于 2012-04-22T16:16:39.247 回答
2

正如我所料,问题是您试图self.view在初始化方法内部进行访问。所以将行self.view.backgroundColor = ...移至viewDidLoad方法:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"%@", self.projectName);
    self.projectNameLabel.text = self.projectName;
    self.view.backgroundColor = [UIColor colorWithRed:((float)rand())/RAND_MAX green:((float)rand())/RAND_MAX blue:((float)rand())/RAND_MAX alpha:1.0];
}

事实上,该view物业的文件说:

如果您访问此属性并且其值当前为 nil,则视图控制器会自动调用 loadView 方法并返回结果视图。

因此,当您调用self.view初始化方法时,视图控制器将不得不加载视图(从 nib 或使用该loadView方法)。这就是为什么viewDidLoad被称为。

于 2012-04-22T16:42:38.243 回答