示例项目:http://cl.ly/283O3a0x2l3h
我正在尝试创建一个包含一些视图的自定义单元格,因此我将UITableViewCell
子类化为如下所示。该子类有一个UILabel,它在init
上创建并位于updateConstraints
中。
但是,每当我运行应用程序时,它都不会在单元格上显示标签。事实上,UITableViewCell子类的init方法永远不会被调用。
这在cellForRowAtIndexPath:
cell.postTitle.text = @"testing";
然而,UITableViewCell子类中的initWithStyle:
永远不会被调用,我无法弄清楚原因。值得注意的是,它有点完成了Interface Builder,但只是UITableView的设置与被认为是UITableViewCell的子类的单元格。
任何人都可以看看并告诉我我做错了什么吗?
答案 0 :(得分:1)
如果您要以编程方式执行此操作,请使用initWithCoder
。更容易,在单元格原型中创建IBOutlet
引用,并且可以消除所有以编程方式完全创建它的代码。只需在代码中定义出口和约束,然后就可以在CSPostCell
实现中淘汰所有代码:
因此,您可以享受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