iOS Developer闻道丶iOS(尝鲜版)

OC--UITableviewCell的优雅new

2017-03-07  本文已影响233人  啊哈呵

以前的代码是这样子的
1、2、3步骤

static NSString *const kXXOOXXXCellIdentifier = @"PSCustomDataPickerTableViewCell";
 [self.tableView registerNib:[UINib nibWithNibName:kPSInputInfoTableViewCellIdentifier bundle:nil] forCellReuseIdentifier:kPSInputInfoTableViewCellIdentifier];
 [self.tableView registerClass:[PSCustomDataPickerTableViewCell class] forCellReuseIdentifier:kPSCustomDataPickerTableViewCellIdentifier];
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kPSInputInfoTableViewCellIdentifier;
        return cell;
}

这里写registerClass,
那里写Identifier定义,
使用时写dequeueReusableCellWithIdentifier。
写来写去这是有多无聊啊,相当于与三个地方在做一件事,我忍了很久了,为什么不能一句代码解决呢?

我想要的样子就一句话:

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

    PSContactsTableViewCell *cell = [PSContactsTableViewCell cellForNibTableView:tableView];
    return cell;
}

源码:UITableViewCell的Categoary

#import <UIKit/UIKit.h>
@interface UITableViewCell (PSInitializeCell)
/**
 获取Cell--Alloc
 */
+ (instancetype)cellForAllocTableView:(UITableView *)tableView;
/**
 获取Cell--Nib
 */
+ (instancetype)cellForNibTableView:(UITableView *)tableView;
@end
#import "UITableViewCell+PSInitializeCell.h"

@implementation UITableViewCell (PSInitializeCell)

+ (instancetype)cellForAllocTableView:(UITableView *)tableView{
    
    
    NSString *cellIdentifier=NSStringFromClass(self);
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
    if (!cell) {//不存在,注册再获取
        [tableView registerClass:[self class] forCellReuseIdentifier:cellIdentifier];
        cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    }
    return cell;
    
}

+ (instancetype)cellForNibTableView:(UITableView *)tableView{
    
    NSString *cellIdentifier=NSStringFromClass(self);
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    
    if (!cell) {//不存在,注册再获取
        
        //nib的一般都是对应的类名。如果有些情况不对应,那就不适合这个方法。
        [tableView registerNib:[UINib nibWithNibName:cellIdentifier bundle:nil] forCellReuseIdentifier:cellIdentifier];
        cell=[tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    }
    return cell;
    
}

@end

外:
1.内次都NSString *cellIdentifier=NSStringFromClass(self);可能消耗性能,以后再慢慢研究它(一个类只能一次,又不定义变量),现在先这样
2.首先注册registerNib cell,然后使用:
1.dequeueReusableCellWithIdentifier:
2.dequeueReusableCellWithIdentifier:forIndexPath:
一直不知道这两者有什么区别?

上一篇下一篇

猜你喜欢

热点阅读