在Xcode 4.2问题中设置IBOutlet属性

时间:2012-01-03 22:54:27

标签: iphone xcode iboutlet

我正在使用基于导航的iPhone应用程序,我在内部视图中定义了一个IBOutlet属性并将其合成,

问题是当我想在推送新视图控制器之前设置IBOutlet值时,不会设置该值。以下是代码中的代码段:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

    MealDetailViewController *mealViewController = [[MealDetailViewController alloc] initWithNibName:@"MealDetailViewController" bundle:nil];

    MealsModel *model = (MealsModel *)[_items objectAtIndex:indexPath.row];

    NSLog(model.Name);// here it writes the name right as a string

    //mealViewController.lblName.text=model.Name;

    [[mealViewController lblName]setText:model.Name];
    [[mealViewController txtDesc]setText:model.Description];

    [self.navigationController pushViewController:mealViewController animated:YES];

    [mealViewController release];
}

我在Xcode的早期版本中没有遇到过这些问题。

2 个答案:

答案 0 :(得分:2)

这与创建视图控制器的视图有关。

当你这样做时

[[mealViewController lblName] setText:model.Name];

你还没有加载它的视图所以lblName将是nil

尝试

(a)明确要求视图,触发要创建的子视图:

[mealViewcontroller view];
[[mealViewController lblName]setText:model.Name];
[[mealViewController txtDesc]setText:model.Description];

(b)让导航控制器为您创建视图

[self.navigationController pushViewController:mealViewController animated:YES];

[[mealViewController lblName]setText:model.Name];
[[mealViewController txtDesc]setText:model.Description];

(c)将值存储在mealViewController中作为属性

MealViewController.h

@property (nonatomic, copy) NSString *lblNameString;
@property (nonatomic, copy) NSString *txtDescString;

MealViewcontroller.m

@synthesize txtDescString, lblNameString;

而不是直接设置标签,而是设置属性。

[mealViewController setLblNameString:model.Name];
[mealViewController setTxtDescString:model.Description];

然后,在你的newWillAppear中,设置它们

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    lblName.text = lblNameString;
    txtDesc.text = txtDescString;
}

(c)是更正确的方法 - (a)和(b)如果你的视图控制器的视图被低内存警告卸载则都会失败。

答案 1 :(得分:0)

我要做的是将* Meal对象传递给MealDetailViewController。然后使用它在MealDetailViewController中设置标签等。一旦我遇到类似的问题并发现我正在初始化属性,我的接收类的ViewDidLoad中的UILabel就会覆盖任何传入的文本。