2012-09-20 63 views
0

我有一个小问题,我需要了解工作原理。我在SO内搜索过,但没有找到任何有效的解决方案。awakeFromNib在使用instantiateWithOwner时未调用:方法

我的场景如下。

我有一个UITableViewController,通过UINib方法instantiateWithOwner:加载单元格(在其表中使用)。

- (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CustomTableViewCell *cell = (CustomTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellClassName]; 
    if (!cell) { 

     NSArray *topLevelItems = [cellLoader instantiateWithOwner:self options:nil]; 
     cell = [topLevelItems objectAtIndex:0]; 
    } 

    // other stuff here... 

    return cell; 
} 

单元显示正确。现在,我需要根据不同的标准定制每个单元格,我认为正确的位置是awakeFromNib方法。神父例如,CustomTableViewCell .M内,我重写awakeFromNib类似如下:

- (void)awakeFromNib 
{ 
    // my internal stuff here 
} 

awakeFromNib不叫。

你能解释我做错了什么吗?

预先感谢您。

回答

1

其实你需要在代码中自定义显示'其他的东西在这里'。由于您需要回收单元,因此需要确保单元在每次使用时均正确配置。

编辑:我做了一个测试项目,并验证了awakeFromNib实际上是发送给这个类的。这导致我相信根本问题是,在你的单元格的笔尖中,你没有将单元格的类设置为你的CustomClass名称。它是唯一可能的解释。

EDIT2:因此,要重申:

  • 在CustomTableViewCell.xib

    ,该对象的类别被设定为 'CustomTableViewCell'

  • 添加一些日志消息CustomTableViewCell.m - 中的initWithCoder :如果你有它,也在awakeFromNib(确保拼写!!!)

  • 当你在这里实例化'cell = [topLevelItems objectAtIndex:0];',在NSLog之前添加一个日志(@“去实例化“),然后a日志:

    NSLog(@"Instantiate a %@ cell", NSStringFromClass([cell class]); 
    

事情已经给这里。你的部署目标是什么?在我的测试中,我使用了5.1

+0

大卫,感谢您的答复。但为什么'awakeFromNib'没有被调用? +1为您的建议。 –

+0

David,感谢您的编辑。我检查了课程,它在正确的地方。很奇怪。 ;(我会做一些测试,我会尽快回复评论,非常感谢您的支持。 –

1

我刚刚遇到了与使用instantiateWithOwner时未调用awakeFromNib相同的问题。但是,我改回使用[[NSBundle mainBundle] loadNibNamed:name owner:self options:nil],并没有解决问题。

然后,添加一个测试选择器到我的自定义视图实现中,当然,这个应用会在无法识别的选择器上崩溃。

所以经过一段时间的拔牙和拔毛之后,原来是一个很基本的错误。

在与自定义视图关联的Xib中,我忘记了在Interface Builder中的身份检查器中输入名称。因此,运行时认为我的课程是UIView的实例,而不是MyCustomView。所以awakeFromNib断点从未触发。

底线:如果你正在使用自定义视图类有关联的厦门国际银行有这个问题,请检查您所设置的类名称是否正确:

enter image description here

相关问题