用于在故事板中以编程方式创建的UITableView的自定义tableviewCells

时间:2013-03-20 07:28:51

标签: ios cocoa-touch uitableview

在我的应用中,我使用的是故事板。但是我以编程方式创建了UITableView,而不是从对象库中拖动。现在我想自定义以编程方式创建的UITableView的单元格。任何人都可以通过提供在故事板中以编程方式创建UITableViewCell的示例来帮助我吗?

2 个答案:

答案 0 :(得分:8)

我会避免将您的单元格的布局和构建放入cellForRowAtIndexPath

要以编程方式创建自定义单元格,首先应创建一个UITableViewCell子类。

添加labelsimageViews等...添加cell.contentView的as子视图。

<强>编程

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 21)];
        [self.contentView addSubview:_label];
    }
    return self;
}

如果你想做单元格的布局,那么你可以在MyCell课程中做...

- (void)layoutSubViews
{
    [super layoutSubviews];
    // layout stuff relative to the size of the cell.
}

然后在tableViewController中你需要注册单元格类......

viewDidLoad ...

[self.tableView registerClass:[MyCell class] forCellReuseIdentifier:@"MyCellIdentifier"];

WITH INTERFACE BUILDER

仍然创建自定义子类,但也创建一个同名的xib文件。然后在你的xib文件中你可以连接出口而不必在单元的init中创建它们。 (如果你这样做,那么无论如何都不会调用init。)

您需要的唯一其他更改是在viewDidLoad中您需要为单元格而不是类注册nib。

喜欢这个......

UINib *cellNib = [UINib nibWithNibName:@"MyCell" bundle:nil];
[self.tableView registerNib:cellNib forCellReuseIdentifier:@"MyCellIdentifier"];

然后其他一切都是一样的。

使用电池

使用您为...创建子类的单元格

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCellIdentifier"];

    [self configureCustomCell:(MyCell*)cell atIndexPath:indexPath];

    return cell;
}

- (void)configureCustomCell:(MyCell*)cell atIndexPath:(NSIndexPath *)indexPath
{
    // do all you logic of getting any info from arrays etc in here.

    cell.label.text = @"Blah".
}

<强>概要

这样做意味着你的tableviewcontroller只对将东西放入单元格感兴趣。如果你把所有的逻辑用于构建你的单元格,那么一切都会变得非常混乱。

这也意味着您不必处理大量不同的标签来保存和检索不同的UI元素。

答案 1 :(得分:0)

我将描述两个选项:使用Interface Builder添加单元格(更简单),并以编程方式添加单元格:

使用Interface Builder

在Interface Builder中创建单元格并添加包含自定义内容的子视图后,打开“属性”检查器,选择自定义样式,并在重用标识符中输入唯一标识符文本字段(例如,“anIdentifier”)。接下来,选择要以编程方式访问的单元格字段,并为每个单元格字段设置唯一的标记编号(位于视图部分下)。

然后,在您的数据源代码中,实现此方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"anIdentifier"];

    UILabel *label;

    label = (UILabel *)[cell viewWithTag:1]; // Set a constant for this so your fellow developers understand this number
    label.text = @"This is a test";

    return cell;
}

<强>编程

如果要以编程方式创建单元格,则代码应与此类似:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"anIdentifier";

    UILabel *aLabel;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]];

        aLabel = [[[UILabel alloc] initWithFrame:...]];
        aLabel.tag = 1; // Set a constant for this
        aLabel.font = [UIFont systemFontOfSize:14.0];
        aLabel.textAlignment = UITextAlignmentRight;
        aLabel.textColor = [UIColor blackColor];
        aLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:mainLabel];
    } else {
        aLabel = (UILabel *)[cell.contentView viewWithTag:1];
    }

    aLabel.text = @"This is a test";

    return cell;
}

Apple的网站上有更多信息:http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/tableview_iphone/TableViewCells/TableViewCells.html