OC--UITableviewCell的优雅new

作者: 啊哈呵 | 来源:发表于2017-03-07 17:27 被阅读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:
    一直不知道这两者有什么区别?

    相关文章

      网友评论

        本文标题:OC--UITableviewCell的优雅new

        本文链接:https://www.haomeiwen.com/subject/bjnmgttx.html