使用自定义表格单元格时,“无法识别的选择器已发送到实例”

时间:2013-05-19 17:29:52

标签: ios objective-c uitableview

我已经实现了一个自定义表格单元格,并在表格进入cellForRowAtIndexPath时收到运行时错误(“无法识别的选择器发送到实例”)。尝试实例化自定义单元格时发生错误。我之前已经成功实现了这一目标,但现在错误不会消失。我有一个prtotype单元格,其自定义类属性设置为自定义单元格UITableViewCell子类。这是自定义单元格:

#import "FavoriteCell.h"

@implementation FavoriteCell
@synthesize lblGaugeID, lblMainTitle, bgImage;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    bgImage = [UIImage imageNamed:@"tableCellBG.png"];
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UIColor *transparentBG = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0];
        UIColor *foregroundColor = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:1.0];
        //UIColor *shadowColot = [UIColor colorWithWhite:0.75 alpha:1.0];

        CGSize size = self.contentView.frame.size;
        self.backgroundView = [[UIImageView alloc] initWithImage:bgImage];
        self.lblMainTitle = [[UILabel alloc] initWithFrame:CGRectMake(8.0, 0.5, size.width-16, size.height-40)];
        [self.lblMainTitle setFont:[UIFont systemFontOfSize:12.0]];
        [self.lblMainTitle setTextAlignment:NSTextAlignmentLeft];
        [self.lblMainTitle setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
        [self.lblMainTitle setBackgroundColor:transparentBG];

        self.lblGaugeID = [[UILabel alloc] initWithFrame:CGRectMake(20.0, 31.0, size.width-16, size.height-40)];
        [self.lblGaugeID setFont:[UIFont boldSystemFontOfSize:15.0]];
        [self.lblGaugeID setTextAlignment:NSTextAlignmentLeft];
        [self.lblGaugeID setTextColor:foregroundColor];
        [self.lblGaugeID setShadowOffset:CGSizeMake(0.2 , 0.2)];
        [self.lblGaugeID setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)];
        [self.lblGaugeID setBackgroundColor:transparentBG];

        [self.contentView addSubview:lblGaugeID];
        [self.contentView addSubview:lblMainTitle];
    }
    return self;
}

@end

这里是它的实例(摘自我的视图控制器类):

-(FavoriteCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = @"favoriteCell";
    FavoriteCell *cell = (FavoriteCell*)[tableView dequeueReusableCellWithIdentifier:cellIdentifier]; //error
    if(cell == nil){
        cell = [[FavoriteCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];
    }
    NSString *siteName = [faveKeys objectAtIndex:indexPath.row];

    [cell.lblMainTitle setText:siteName];
    [cell.lblGaugeID setText:[allFavorites objectForKey:siteName]];
    return cell;
}

以下是完整的错误消息:

  

* 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [__ NSCFConstantString instantiateWithOwner:options:]:无法识别的选择器发送到实例0x24bb0'

有人可以就检查什么提供一些建议吗?谢谢!维维

1 个答案:

答案 0 :(得分:11)

如果您在单独的NIB文件中定义了自定义单元格,那么使用- (void)registerNib:(UINib *)nib forCellReuseIdentifier:(NSString *)identifier是个好主意。问题是您传递的是NSString而不是UINib对象。

请改为:

[self.tblFavorites registerNib:[UINib nibWithNibName:@"favoriteCellView" bundle:nil] forCellReuseIdentifier:@"favoriteCell"];

然而因为您使用的是原型单元而不是单独的NIB,所以根本不需要这样做。相反,您只需确保正确设置原型单元的重用标识符(在本例中为“favoriteCell”)。