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

Why does the label never show up in my UITableViewCell subclass?

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

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

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

这在cellForRowAtIndexPath:中被称为

1
cell.postTitle.text = @"testing";

然而,uiTableViewCell子类中的EDOCX1[4]从未被调用过,我也不知道为什么。值得注意的是,它在Interface Builder中做了一些工作,但仅仅是使用单元格设置的UITableView被视为UITableViewCell的子类。

有人能看看告诉我我做错了什么吗?


如果您要以编程方式进行,请使用initWithCoder。更简单的是,在单元原型中创建IBOutlet引用,您可以消除所有以编程方式创建的代码。只需在代码中定义出口和约束,然后您就可以在CSPostCell实现中收回所有代码:

outlets for table view cell

因此,您可以享受CSPostCell子类的好处,但没有任何代码。


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

1
2
3
4
5
6
7
8
9
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
    if (self == nil) return nil;

    // Initialization code goes here...

    return self;
}

有关如何从NIB文件和故事板反序列化对象的详细信息,请参阅《存档和序列化编程指南》。


下面是一个如何从NIB文件加载自定义单元的示例。自定义TableView单元(FileTableViewCell)是在ib中创建的,它包含两个标签、一个进度条、一个按钮,有时还会向AccessoryView添加活动指示器。因此,尝试用cell = [YourSubClass...]替换cell = [nib...行,然后根据应用程序的要求修改其余行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
- (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;
}