使用数据加载自定义ViewController

时间:2011-12-04 16:58:35

标签: objective-c ios ios4 ios5

我有一个UITableView,它通过它的navigationController加载一个新的viewcontroller。 此代码位于tableView:didSelectRowAtIndexPath方法:

ConcertDetailViewController *detailVC = [[ConcertDetailViewController alloc] initWithNibName:@"ConcertDetailViewController" bundle:nil];

UITableView有一个模型,我想将这个模型的元素发送给新创建的ViewController。

detailVC.aProd = [_prod objectAtIndex:indexPath.row];

设置值时,我希望detailVC在屏幕上绘制数据。我认为一个自定义的setter,覆盖@synthesize生成的那个可以工作。

-(void)setaProd:(NSMutableDictionary *)aProd {
_aProd = aProd;
[self displayAProd];
}

displayAProd只是获取aProd中的值并将它们放在屏幕上,或者我设置了一个在我的nib文件中创建的插座值。

self.prodNameLbl.text = [_aProd objectForKey:@"name"];

没什么特别的。但它只是不起作用。我想,我想出了原因。 这是因为setter执行速度更快,将整个视图加载到内存中。 如果我把self.prodNameLbl.text = @“某事”;在viewDidLoad方法中,它确实在标签中显示正确的值。 一个快速的解决方法是查看是否已设置_concerts并从那里调用displayAProd。在这里,我怀疑自己是否是加载视图的好方法。如果自定义setter执行加载视图需要更长时间,该怎么办?查看_concerts是否已设置的测试将为false,不会显示任何内容。或者这是不可能发生的?

或者可能有更好的模式来加载视图并将数据传递给它们进行显示。

先谢谢Jonas。

1 个答案:

答案 0 :(得分:0)

问题是当您从NIB加载视图控制器时,在initWithNibName调用期间,IBOutlets将不会连接到您的UILabel和其他类似属性。

您需要等待在detailVC上调用viewDidLoad并从那里调用[self displayAProd]。此时,将建立连接。

快速测试。在didSelectRowAtIndexPath方法中放置一个断点,并在初始化detailVC之后,检查prodNameLbl是否为null。