[ios]需要援助的理解自定义 uitableviewcell 初始化

发布时间: 2017/3/21 23:24:15
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

同时执行自定义 UITableViewCelltableView:cellForRowAtIndexPath: 这两种方式之间的区别

loadNibNamed:owner:options:

SimpleTableCell *cell = [[SimpleTableCell alloc]init];

是否 loadNibNamed:owner:options:alloc init 吗? 如果不如何 SimpleTableCell 将工作没有 alloc init 吗?

SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
    if (cell == nil) 
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    }

还有的没有显式调用SimpleTableCell *cell = [[SimpleTableCell alloc]init];

解决方法 1:

好吧,第一次关闭。我实际上并没有要回答这个问题的根本。相反,我会告诉你如何创建和使用自定义 UITableViewCell 子类。此刻你在做什么,这是不对的。

让我们坚持名称 SimpleTableCell ,使用过。

创建子类别

创建一个子类的 UITableViewCell

SimpleTableCell.h

@interface SimpleTableCell : UITableViewCell

// if coding only
@property (nonatomic, strong) UILabel *simpleLabel

// if from nib
@property (nonatomic, weak) IBOutlet UILabel *simpleLabel;

@end

SimpleTableCell.m

#import "SimpleTableCell.h"

@implementation SimpleTableCell

// if coding only
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        //create the simpleLabel and add to self.contentView
    }
    return self;
}

// if from nib no need to do anything at all

// other stuff...

- (void)prepareForReuse
{
    // empty the cell here.
    // means you don't have to empty everything out in the controller
    self.simpleLabel.text = @"";
}

@end

好,所以现在我们有一个单元格类。

如果这是你想要,创建nib

看起来你已经这么做了。

创建具有相同名称的nib (或不,真的没关系)。

使的顶级项目 UITableViewCell 和设置子类为 SimpleTableCell 。现在连接插座。在此示例中 simpleLabel 就是全部连接。

注册子类的表视图

在拥有的表视图的视图控制器。这意味着表视图可以处理创建和出队的细胞,你不必手动创建它们根本。

- (void)viewDidLoad
{
    [super viewDidLoad];

    // set up the other stuff...

    // if coding only
    [self.tableView registerClass:[SimpleTableCell class] forCellReuseIdentifier:@"SimpleCell"];

    // if from a nib
    UINib *cellNib = [UINib nibWithNibName:@"SimpleTableCell" bundle:[NSBundle mainBundle]];
    [self.tableView registerNib:cellNib forCellReuseIdentifier:@"SimpleCell"];
}

现在你只是让处理创建单元格的表。它会跟踪的重用标识符和细胞队列使它可以处理一切正常。你只需要让它取消单元格为你排队你注册你的子类的标识符。

- (UITableViewCell*)tableView:(UITableView *)tableView cellFroRowAtIndexPath:(NSIndexPath *)indexPath
{
    // This API was introduced in iOS6 and will ALWAYS return a valid cell.
    // However, you need to register the class or nib with the table first.
    // This is what we did in viewDidLoad.
    // If you use a storyboard or nib to create a tableview and cell then this works too.
    SimpleTableCell *mySimpleCell = [tableView dequeueReusableCellWithIdentifier:@"SimpleCell" forIndexPath:indexPath];

    mySimpleCell.simpleLabel.text = @"Hello, World";

    return mySimpleCell;
}

编辑

您可以创建单元格 (事实上任何类) 使用...

SimpleTableCell *cell = [[SimpleTableCell alloc] init];

但这样做就意味着它并不是关联到表视图或队列的一部分。

下的一步 (如果你喜欢) 从我的答案的方法是使用旧 dequeuReusableCell... 方法,然后再检查是否为零并创造它喜欢这...

- (UITableViewCell*)tableView:(UITableView *)tableView cellFroRowAtIndexPath:(NSIndexPath *)indexPath
{
    // Old way, don't do this if you're targeting iOS6.0+
    SimpleTableCell *mySimpleCell = [tableView dequeueReusableCellWithIdentifier:@"SimpleCell"];

    if (!mySimpleCell) {
        // have to use initWithStyle:reuseIdentifier: for the tableView to be able to dequeue
        mySimpleCell = [[SimpleTableCell alloc] initWithStyle:UITableViewCellStyleCustom reuseIdentifier:@"SimpleCell"];
    }

    mySimpleCell.simpleLabel.text = @"Hello, World";

    return mySimpleCell;
}

我不知道你可以加载从nib在这里,因为你不能在单元格上设置重用标识符。

多个单元格子类

好吧,最后编辑:D

多个 UITableViewCell 你也可以使用这个子类。我正是这样做在过去了。你可能,例如,有一个单元格用于 Post 项目一个单元格用于 Image 项目一个单元格用于 Comment 项目等等......,他们都是各不相同。

苏。

- (void)viewDidLoad
{
    // the rest

    // register each subclass with a different identifier
    [self.tableView registerClass:[PostCell class] forCellReuseIdentifier:@"PostCell"];
    [self.tableView registerClass:[ImageCell class] forCellReuseIdentifier:@"ImageCell"];
    [self.tableView registerClass:[CommentCell class] forCellReuseIdentifier:@"CommentCell"];
}

为了保持这小 (和它派上用场为 NSFetchedResultsControllers 太,我将配置出单元格移动到另一种方法。

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

    if (the required cell is a post cell) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath];
        [self configurePostCell:(PostCell *)cell atIndexPath:indexPath];
    } else if (the required cell is a image cell) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"ImageCell" forIndexPath:indexPath];
        [self configureImageCell:(ImageCell *)cell atIndexPath:indexPath];
    } else if (the required cell is a comment cell) {
        cell = [tableView dequeueReusableCellWithIdentifier:@"CommentCell" forIndexPath:indexPath];
        [self configureCommentCell:(CommentCell *)cell atIndexPath:indexPath];
    }

    return cell;
}

- (void)configurePostCell:(PostCell *)postCell atIndexPath:(NSIndexPath *)indexPath
{
    // get the object to be displayed...

    postCell.postLabel = @"This is the post text";
    postCell.dateLabel = @"5 minutes ago";
}

- (void)configureImageCell:(ImageCell *)imageCell atIndexPath:(NSIndexPath *)indexPath
{
    // get the object to be displayed...

    imageCell.theImageView.image = //the image
    imageCell.dateLabel = @"5 minutes ago";
}

- (void)configureCommentCell:(CommentCell *)commentCell atIndexPath:(NSIndexPath *)indexPath
{
    // you get the picture...
}
官方微信
官方QQ群
31647020