封装TableView有可能用到的数据结构和UITableViewCell的一个继承类

最近4年的时间,我已经做了5个App完全独立开发, 工作经历5个App, 维护了两个App.

在这期间用的最多的是UITableView, 因此也有许多感觉可以封装的.

现在就是我封装的.

RXCell 继承于UITableViewCell

// 所以TableViewCell的基类
@interface RXCell : UITableViewCell
// 用data更新cell数据
- (void)setData:(id)data;
// 从xib中获取cell,记得在xib设置identify
+ (id)cell_xib;
// 用initWithStyle:reuseIdentifier:方式获取cell
+ (instancetype)cell;
// cell 的高度,需要子类去实现
+ (CGFloat)cellHeight;
// 默认的是Class的字符串,子类不需要重写
+ (NSString *)identifier;
@end


@implementation RXCell
- (void)setData:(id)data
{
    // Do Nothing
}+ (id)cell_xib
{
    NSArray *nibView =  [[NSBundle mainBundle] loadNibNamed:[self identifier] owner:nil options:nil];
    return nibView[0];
}
+ (instancetype)cell
{
    Class cls = [self class];
    id cell = [[cls alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self identifier]];
    return cell;
}
+ (CGFloat)cellHeight
{
    return 0;
}
+ (NSString *)identifier
{
    return NSStringFromClass([self class]);
}
@end

 

RXFunctionItem

@interface RXFunctionItem : NSObject
@property (nonatomic, copy) NSString *iconName;     // 图片名称
@property (nonatomic, copy) NSString *title;        // 名称
@property (nonatomic, assign) SEL action;           // action
@property (nonatomic, assign) int type;             // type
@property (nonatomic, strong) id object;            // 扩展数据
- (id)initWithIconName:(NSString *)iconName title:(NSString *)title action:(SEL)action type:(int)type;
- (id)initWithIconName:(NSString *)iconName title:(NSString *)title action:(SEL)action type:(int)type object:(id)object;
@end

 

在自定义的TestCell需要添加代码:

@interface TestCell ()
@property (weak, nonatomic) IBOutlet UILabel *lblTitle;
@end
@implementation TestCell
- (void)setData:(id)data
{
    if ([data isKindOfClass:[RXFunctionItem class]]) {
        RXFunctionItem *tmp = data;
        self.lblTitle.text = tmp.title;
    }
}
- (void)awakeFromNib {
    // Initialization code
    self.lblTitle.backgroundColor = [UIColor redColor];
}
+ (CGFloat)cellHeight
{
    return 50;
}
@end

 

在VC中使用:

#pragma mark - UITableViewDataSource
#pragma mark Required
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.functionItems.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    id item = self.functionItems[indexPath.row];
    NSString *identify = [TestCell identifier];
    TestCell *cell = (TestCell *)[tableView dequeueReusableCellWithIdentifier:identify];
    if (cell == nil) {
        cell = [TestCell cell_xib];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    [cell setData:item];
    return cell;
}
#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return [TestCell cellHeight];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    RXFunctionItem *item = self.functionItems[indexPath.row];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    if (item.action != nil) {
        [self performSelector:item.action withObject:item afterDelay:0];
    }
}
#pragma mark - Action
- (void)cell0Action:(id)sender
{
    NSLog(@"cell0Action:%@", sender);
}
- (void)cell1Action:(id)sender
{
    NSLog(@"cell1Action:%@", sender);
}
- (void)cell2Action:(id)sender
{
    NSLog(@"cell2Action:%@", sender);
}
#pragma mark - View Life Cycle
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    RXFunctionItem *item0 = [[RXFunctionItem alloc] initWithIconName:@"" title:@"第1行" action:@selector(cell0Action:) type:0 object:nil];
    RXFunctionItem *item1 = [[RXFunctionItem alloc] initWithIconName:@"" title:@"第2行" action:@selector(cell1Action:) type:0 object:nil];
    RXFunctionItem *item2 = [[RXFunctionItem alloc] initWithIconName:@"" title:@"第3行" action:@selector(cell2Action:) type:0 object:nil];
    self.functionItems = @[item0, item1, item2];
    [self.tableView reloadData];
}

 

思路是:

VC 用RXFunctionItem准备好数据, 然后给UITableViewDataSource和UITableViewDelegate使用,

在cellForRowAtIndexPath中把数据取出来, 然后Cell取刷新数据.

 

参考: https://github.com/xzjxylophone/RXTableViewItem

 

posted on 2015-11-20 16:02  传说中的汽水枪  阅读(377)  评论(0编辑  收藏  举报

导航