如何挂钩UITableViewCell / UICollectionViewCell的init方法?

时间:2018-01-19 16:10:41

标签: ios objective-c uitableview uicollectionviewcell

我们像这样使用UITableViewCell。

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.tableView registerNib: [UINib nibWithNibName: Cell bundle: nil] forCellReuseIdentifier: kIdentifier];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Cell *cell = [tableView dequeueReusableCellWithIdentifier: kIdentifier forIndexPath: indexPath];
    return cell;
}

当细胞出生时具有某些属性(标记),如何获取细胞的- init方法,自定义它并标记细胞?

因为我在调用相关方法时没有看到任何机会。

那么如何挂钩UITableViewCell / UICollectionViewCell的init方法?

这是一种情况:

img

有两页。单元格有页面标记。

当然,我可以添加财产。只是去垃圾更远。

2 个答案:

答案 0 :(得分:1)

init并不是很有用,因为细胞很少被创建然后重复使用。

也就是说,当最初创建单元格时,您可以通过重载awakeFromNib来拦截它。如果以后重复使用,则会调用prepareForReuse

不要忘记在两种方法中调用超级实现。

答案 1 :(得分:1)

我建议创建一个UITableViewCell的简单子类。通过这种方式,您可以创建自定义表格单元格,其中包含您希望单元格包含的任何内容"细胞的初始化。然后,您可以将nib文件类设置为,例如CustomTableViewCell

然后,就像您已经展示的那样,您可以从reuseIdentifier创建自定义单元格:

此外,您可以截取其他内置方法awakeFromNib甚至prepareForReuse以进一步自定义。

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

    CustomTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: kIdentifier forIndexPath: indexPath];

    // Do anything else here you would like. 
    // [cell someCustomMethod];

    return cell;
}

·H

#import <UIKit/UIKit.h>

@interface CustomTableViewCell : UITableViewCell

- (void)someCustomMethod;
...
@property (nonatomic, nullable) <Some class you want> *somePropertyName;
...
@end

的.m

#import "CustomTableViewCell.h"

@implementation CustomTableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {

    if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
        // Do whatever you would like to do here :)
    }

    return self;

}

- (void)awakeFromNib {

    [super awakeFromNib];

    // Initialization code. Do whatever you like here as well :)

}

- (void)prepareForReuse {

    [super prepareForReuse];

    // And here.. :)

}

@end