2011-12-04 41 views
2

我有一个UITableView通过它的navigationController加载一个新的viewcontroller。 此代码放在了的tableView:didSelectRowAtIndexPath方法方法:使用数据加载自定义ViewController

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

的UITableView中有一个模式,我想送这个模型的元素到新创建的视图控制器。

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

当值设为我想detailVC绘制屏幕上的数据。我认为自定义setter,覆盖由@synthesize生成的那个会起作用。

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

displayAProd只需要在aProd的价值观念,是他们在屏幕上,或者更确切地说,我设置一个出口的一些价值,在我的笔尖文件中创建。

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

这没什么特别的。但它不起作用。我想,为什么呢? 这是因为setter执行的方式更快,然后将整个视图加载到内存中。 如果我把self.prodNameLbl.text = @“something”;在viewDidLoad方法中,它在标签中显示正确的值。 快速的解决方法是查看是否已设置_concerts并从那里调用displayAProd。在这里,我怀疑自己是否是加载视图的好方法。如果自定义设置器花费更长时间来执行加载视图,会怎样?查看_concerts是否已设置的测试将是错误的,并且不会显示任何内容。或者这是不可能发生的?

或者,也许有更好的模式来加载视图并将数据传递给它们来显示。

感谢先进的乔纳斯。

回答

0

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

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

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

+0

prodNameLbl在以下情况下获取值集:[self.navigationController pushViewController:detailVC animated:YES];叫做。这是紧跟在detailVC.aProd = [_prod objectAtIndex:indexPath.row]; 所以我想我可以放心地假设,如果viewDidLoad被调用_concerts肯定会被设置并准备好被利用。 –

+0

当然,一般不要认为控制器已经准备好,直到ViewController的视图属性被访问完毕。这通常是视图第一次出现时是这样,当你将它推入导航控制器时,它应该已经准备就绪。 在您的ViewController中侦听的其他消息是awakeFromNib(详情请参阅http://developer.apple.com/library/ios/#documentation/uikit/reference/NSObject_UIKitAdditions/Introduction/Introduction.html) – reddersky

+0

awakeFromNib doesn'似乎在做伎俩。 从Apple的文档中我得到:在iOS中,此消息仅发送给由nib加载代码实例化的接口对象。它不会发送到文件所有者,第一响应者或任何其他占位符对象。 所以它只被发送到由nib加载代码实例化的接口对象。我不确定这是什么意思? –