0

UITableViewController在其.m默认初始化方法中创建一个默认视图控制器,如下所示

- (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;
4

1 回答 1

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;
}
于 2013-09-21T05:41:41.113 回答