创建自定义UITableViewCell

时间:2013-02-28 04:15:35

标签: objective-c uitableview ios6 storyboard custom-controls

我正在尝试创建自定义UITableViewCell。

从XCode 4.6界面构建器,我将单元格的Style属性设置为Custom。并使用拖放操作向单元格添加控件。 2 UILables和UIButton。它看起来像这样。

enter image description here

我创建了一个从UITableViewCell派生的单独类来分配3个UI元素的属性并在那里进行更改。我也从Identity Inspector中将单元格的自定义类设置为DashboardCell。

DashboardCell.h

#import <UIKit/UIKit.h>

@interface DashboardCell : UITableViewCell

@property (weak, nonatomic) IBOutlet UILabel *numberOfMails;
@property (weak, nonatomic) IBOutlet UILabel *mailType;
@property (weak, nonatomic) IBOutlet UIButton *numberOfOverdueMails;

@end

DashboardCell.m

#import "DashboardCell.h"

@implementation DashboardCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        [self.numberOfOverdueMails setBackgroundColor:[UIColor colorWithRed:244/255.0f green:119/255.0f blue:125/255.0f alpha:1.0f]];
        [self.numberOfOverdueMails setTitle:@"lol" forState:UIControlStateNormal];
    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

在TableViewController中,我修改了以下方法以返回我的自定义单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    DashboardCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    if (cell == nil) {
        cell = [[DashboardCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    return cell;
}

我的问题是即使显示自定义按钮,我所做的更改(更改按钮的背景颜色,更改一个UILabel的标题)也没有显示出来。这里的错误似乎是什么?

2 个答案:

答案 0 :(得分:4)

不会调用方法initWithStyle:reuseIdentifier:,因为您正在使用界面构建器来创建单元格。

您可以通过覆盖方法awakeFromNib.

来设置背景颜色和标题

您也可以在方法tableView:cellForRowAtIndexPath:

中设置这些内容

答案 1 :(得分:2)

如果从xib或故事板中获取单元格,dequeueReusableCellWithIdentifier:forIndexPath:将始终返回一个单元格 - 如果存在,它将重用它,否则它将从IB中的模板创建一个单元格。因此,您的if(cell ==nil)子句永远不会得到满足,实际上不再需要。如果您想使用init方法,请使用initWithCoder: