我已经多次使用完全相同的代码完成了这项工作,但由于某种原因,它今天无效。
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
的
-(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)
的{{1}}值来自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;
}
答案 0 :(得分:2)
在为视图控制器显示之前调用viewDidLoad 第一次,而不是在initWithNibName之后。
<强>&GT; viewDidLoad方法在视图控制器加载其视图后调用 层次结构到内存。无论是否调用此方法 视图层次结构是从nib文件加载或以编程方式创建的 在loadView方法中。
<强>&GT; initWithNibName您指定的nib文件不会立即加载。它 在第一次访问视图控制器的视图时加载。如果 你想在nib文件后执行额外的初始化 加载,覆盖viewDidLoad方法并在那里执行任务。
您可以使用App委托将数据从一个传递到另一个,这是另一种替代解决方案。
you do in initWithNibName method itself. or in viewDidAppear.
你的initWithNibName方法应该像 @sch 评论那样;
- (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需要什么(一旦加载到内存中)
答案 1 :(得分: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
的原因。