在UITableViewController
中创建.m
的默认视图控制器,默认的init方法如下
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self) {
// Custom initialization
}
return self;
}
在添加数据源和委托方法的标准程序之后,更正iPhone模拟器上显示的表视图。
我的问题是,尝试在NSLog(@"did init");
中添加if
时,如下所示
- (id)initWithStyle:(UITableViewStyle)style
{
self = [super initWithStyle:UITableViewStyleGrouped];
if (self) {
// Custom initialization
NSLog(@"did init");
}
return self;
}
但再次运行,did init
未显示在控制台上。甚至在NSLog
之前或之后移动if
,两者都不起作用!
有什么问题?为什么initWithStyle:(UITableViewStyle)style
不起作用?
如果使用迈克尔建议的initWithCoder
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"init?");
self = [super initWithStyle:UITableViewStyleGrouped];
if (self) {
NSLog(@"init done");
}
return self;
}
init?
和init done
在控制台上工作并显示。但也是失败。
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'UITableView dataSource must return a cell from tableView:cellForRowAtIndexPath:'
实际上,如果删除`initWithCoder,app就可以了。
cellForRowAtIndexPath
处的代码如下,
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
NSArray * array = [[temp objectAtIndex:indexPath.section] valueForKey:@"English"];
cell.textLabel.text = [array objectAtIndex:indexPath.row];
if (indexPath.row == 0) {
cell.textLabel.textColor = [UIColor blueColor];
}
return cell;
答案 0 :(得分:3)
“initWithStyle:
”是从代码创建UITableViewController的调用。
如果您是从故事板创建对象,那么真正被调用的方法就是:
- (id)initWithCoder:(NSCoder *)decoder
您也会收到“awakeFromNib
”消息。
编辑添加:
如果您尝试使用“initWithCoder
”方法执行某些操作,请同时调用“super
”,如下所示:
- (id)initWithCoder:(NSCoder *)aDecoder
{
NSLog(@"init?");
self = [super initWithCoder: aDecoder];
if (self) {
NSLog(@"init done");
}
return self;
}