2009-11-26 92 views
1

里面一个UIViewController的,我执行以下操作:iPhone - NSString的值未设置


TVController* stopTimes = [ [ TVController alloc ] initWithStyle: UITableViewStyleGrouped ]; 
stopTimes.tableView.frame = CGRectMake(0, 180, 320, 280); 
stopTimes.tableView.backgroundColor = [ UIColor whiteColor ]; 
stopTimes.theID = stopID; 
[ self.view addSubview: stopTimes.tableView ]; 

其中TVController是一个UITableViewController。

在TVController类中,我有一个名为theID的NSString属性已被合成。在执行上面的“stopTimes.theID = stopID”时我没有遇到任何错误,并且TableView按预期显示。在这个TVController类的'viewDidLoad'中,我只是简单地尝试NSLog'theID'来表明它的工作,但它是(null),不管我做什么。

但是,我试图设置单元格的文本'theID',它工作得很好。

那么为什么'theID'在设置单元格时正确设置,而不是在viewDidLoad中?

+0

你是如何初始化stopID的? – 2009-11-26 06:09:33

回答

1

viewDidLoad将在加载视图后立即调用,无论是从您的NIB还是您的loadView实现。视图在第一次访问视图控制器的视图属性时被加载,而不是在视图控制器被分配时或稍后的时间点加载。

这意味着loadView(其中的缺省实现将加载您的NIB,如果有的话),然后viewDidLoad在第二行中被第一次调用,因为您正在访问视图控制器的tableView属性,在为视图控制器的ID属性实际设置一个值之前会发生这种情况。当然,当你的表格内容被加载时(除非你在别处调用了-reloadContent,否则直到表格视图实际出现才会发生),你的theID属性已经被设置。

你可以非常简单地通过在调试器中设置两个断点来测试你自己 - 在你设置theID属性的上面的代码片段的第三行中,以及在viewDidLoad中的NSLog()调用中的一个断点。你会看到后面的断点是先触发的。

P.S.欢迎来到堆栈溢出!不要忘记阅读常见问题解答,并为您的问题标记接受的答案(当然,如果它们是值得接受的好答案)。

+0

梦幻般的答案!我现在已经解决了这个问题。这样一个简单的解决方案,否则会花费我很多时间。感谢您的回答并感谢您的欢迎! – 2009-11-26 06:56:16