为什么标签永远不会出现在我的UITableViewCell子类中?

时间:2013-11-30 23:24:11

标签: ios objective-c uiview uitableview

示例项目:http://cl.ly/283O3a0x2l3h

我正在尝试创建一个包含一些视图的自定义单元格,因此我将UITableViewCell子类化为如下所示。该子类有一个UILabel,它在init上创建并位于updateConstraints中。

但是,每当我运行应用程序时,它都不会在单元格上显示标签。事实上,UITableViewCell子类的init方法永远不会被调用。

这在cellForRowAtIndexPath:

中调用
cell.postTitle.text = @"testing";

然而,UITableViewCell子类中的initWithStyle:永远不会被调用,我无法弄清楚原因。值得注意的是,它有点完成了Interface Builder,但只是UITableView的设置与被认为是UITableViewCell的子类的单元格。

任何人都可以看看并告诉我我做错了什么吗?

3 个答案:

答案 0 :(得分:1)

如果您要以编程方式执行此操作,请使用initWithCoder。更容易,在单元格原型中创建IBOutlet引用,并且可以消除所有以编程方式完全创建它的代码。只需在代码中定义出口和约束,然后就可以在CSPostCell实现中淘汰所有代码:

outlets for table view cell

因此,您可以享受CSPostCell子类带来的好处,但不需要任何代码。

答案 1 :(得分:0)

以下是如何从NIB文件加载自定义单元格的示例。自定义tableView单元格(FileTableViewCell)在IB中创建,包含两个标签,一个进度条,一个按钮,有时活动指示器会添加到accessoryView中。因此,请尝试将cell = [nib...行替换为cell = [YourSubClass...],然后根据应用的需要修改其余内容。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"FileTableViewCell";
    //LOG(@" tableView:cellForRowAtIndexPath:");
    FileTableViewCell *cell = (FileTableViewCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil)
    {
        //LOG(@" cell is nil so create one");
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"FileTableViewCell" owner:self options:nil];
        //FLOG(@" nib is %@", nib);
        cell = [nib objectAtIndex:0];
    }

    // Configure the cell.
    FileRepresentation* fileRepresentation = _fileList[indexPath.row];
    cell.textLabel.text = [self userFilename:[fileRepresentation.fileName stringByDeletingPathExtension]];

    cell.detailTextLabel.text = [fileRepresentation modifiedDate];

    float percentage = [fileRepresentation.percentDownloaded intValue] / 100.0;
    int ds = [self downloadStatus:fileRepresentation];


    if (ds == 1) {
        //FLOG(@" download process for file is %f", percentage);
        cell.textLabel.textColor = [UIColor grayColor];
        cell.accessoryType = UITableViewCellAccessoryNone;
        UIActivityIndicatorView *progressView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        cell.accessoryView = progressView;
        [cell.progressIndicator setHidden:NO];
        [cell.progressIndicator setProgress:percentage];
        [progressView startAnimating];
    }
    if (ds == 2) {
        //FLOG(@" download process for file is %f", percentage);
        cell.textLabel.textColor = [UIColor grayColor];
        cell.accessoryType = UITableViewCellAccessoryNone;
        UIActivityIndicatorView *progressView = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        cell.accessoryView = progressView;
        [cell.progressIndicator setHidden:NO];
        [cell.progressIndicator setProgress:percentage];
        [progressView startAnimating];
    }
    if (ds == 3) {
        cell.textLabel.textColor = [UIColor blackColor];
        cell.accessoryView=nil;
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        [cell.progressIndicator setHidden:YES];

    }
    cell.imageView.image = [UIImage imageNamed:_fileImageName];
    return cell;
}

答案 2 :(得分:0)

在运行时加载自定义UITableViewCell子类的实例时,将调用其initWithCoder:方法而不是initWithStyle:方法。 (如果您使用initWithStyle:创建了一个新实例,则可以调用alloc,但这不是这种情况。)要解决此问题,只需相应地更改方法签名。

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self == nil) return nil;

    // Initialization code goes here...

    return self;
}

有关如何从nib文件和故事板反序列化对象的更多信息,请参阅Archives and Serializations Programming Guide