用[super initWithStyle:UITableViewStyleGrouped]初始化UITableViewController

问题描述:

正如我理解这正确地形成Apple Api,使用initWithStyle方法初始化UITableViewController时,它应该返回一个对self.tableView中的UITableView的引用。这是有道理的,因为你无法在初始化后改变tableView的风格。用[super initWithStyle:UITableViewStyleGrouped]初始化UITableViewController

但在我的情况下,这不会发生。


- (id)initWithSomeData:(SomeData *)someData { 
    self = [super initWithStyle:UITableViewStyleGrouped]; 
    if (self) { 
    } 
    NSLog(@"self? %@ tableView? %@", self, self.tableView); 
    return self; 
} 

此显示器是self的对象ID,但self.tableView为null。 我做错了什么? 我没有使用接口构建器!

答案: Jan事实上是正确的,我发现UITableViewController的初始化过程与普通的UIViewController有些不同。

我的理解是,在创建时,init方法中的一个被调用,并且会在调用任何其他方法(loadView,viewDidLoad)之前完成。这对于UIViewController是正确的,但对于UITableViewController不适用。

UITableViewController initWithStyle初始化程序实际上调用loadView和viewDidLoad作为其初始化过程的一部分。 self.tableView的属性是在loadView中设置的,但是如果您重写了loadView,那么我不这么做,因此self.tableView没有被设置。

tableView对象可能是在稍后创建的。尽量覆盖:

-(void)viewDidLoad; 

self.tableView应指向在该点有效的对象。

+0

这是一个很好的idee Jan,不幸的是,行NSLog(@“tableView?%@”,self.tableView);当作为LoadView中的第一行放置时,导致我的应用程序崩溃。并且在放置在viewDidLoad中时也会返回null null – DIJ 2011-04-11 12:21:53

+0

这很奇怪,在其他地方一定有错误,你可以发布整个类吗? – 2011-04-11 12:40:54

+0

我真的发现了这个问题,想把它作为我自己的问题的答案发布,但这不允许在24小时内为新用户...奇怪。 – DIJ 2011-04-11 12:50:20