在视图之间传递数据不起作用

时间:2012-04-22 16:01:17

标签: iphone objective-c ios ipad

我已经多次使用完全相同的代码完成了这项工作,但由于某种原因,它今天无效。

 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;
}

2 个答案:

答案 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的原因。