使用UINavigationController传递数据

时间:2012-05-13 19:14:45

标签: iphone ios uiviewcontroller uinavigationcontroller

[我有这个工作,但我不明白为什么我的“修复”让它工作。]

作为学习练习的一部分,我正在创建一个简单的表格。当用户选择表中的单元格时,我希望它转到第二个UIViewController。第二个UIViewController有一个标签,显示所选单元格的文本。

“父级”类使用此方法创建子级&设置文字:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  child = [[WDRViewControllerFirstChild alloc] initWithNibName:nil bundle:nil];
  child.title = [colors objectAtIndex:indexPath.row];
  child.labelText = [colors objectAtIndex:indexPath.row];
  [self.navigationController pushViewController:child animated:YES];  
}

然后在WDRViewControllerFirstChild中,我有两种方法。如果我以这种方式接近它,一切正常。

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
      label = [[UILabel alloc] initWithFrame:CGRectMake(10, 10, 100, 50)];
      colorMap = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:[UIColor redColor], [UIColor greenColor], [UIColor blueColor], nil] forKeys:[NSArray arrayWithObjects:@"red", @"green", @"blue", nil]];
//      Adding the subview here won't work.  Why?
//      [self.view addSubview:label];
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
  [self.view addSubview:label];
  label.text = labelText;
  label.textAlignment = UITextAlignmentCenter;
  label.backgroundColor = [UIColor whiteColor];
  self.view.backgroundColor = [colorMap objectForKey:labelText];
}

最初,我将子节点分配给init调用中的子视图,但是这不起作用。也就是说,文本标签不能正确显示已选择项目的文本。 (这将是空白的。)

我添加了一些NSLog调用,另外发现如果我将addSubview调用从viewDidLoad移动到init,则labelText的值为null。但是,在上面的表格中,它已正确设置。

我很高兴它正在工作,但我不明白为什么一个工作&另一个。特别是,我真的很困惑为什么设置labelText会根据我调用addSubview的地方而工作。

任何见解?

1 个答案:

答案 0 :(得分:1)

-addSubview仅在视图实际上完全从XIB加载时才起作用,否则它会调用nil并生成nil。在调用-initWithNibName:bundle:时,操作系统很可能解冻(字面上)您指定的XIB并进行设置,因此视图属性为零。在-viewDidLoad,您可以合理地确定视图的存在,这样就可以完成大多数设置工作。至于(NULL)标签文本,无论iVar labelText是什么,你都没有实例化它。删除该行。