我正在使用基于导航的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的早期版本中没有遇到过这些问题。
答案 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就会覆盖任何传入的文本。