UITableViewCell總結(jié)

// 注意:
1. 通過xib來創(chuàng)建UITableViewCell需要在xib的identity上寫上重用標(biāo)識

 2. 通過storyboard來創(chuàng)建UITableViewCell需要在storyboard的identity上寫上重用標(biāo)識

 3.  有時(shí)候每一行的cell用的不一定是同一種UITableVIewCell柱查,對象池中也會有不同的UITableViewCell等待重用讨惩,那么在重用的時(shí)候可能得到的是錯(cuò)誤的UITableViewCell}
     解決方法:可以通過重用屬性reuseIdentifier來對應(yīng)不同的UITableViewCell

 4. 往cell添加子控件的時(shí)候苛茂,把子控件添加到contentView上面

 5. 不應(yīng)該在initWithStyle中設(shè)置子控件的Frame,因?yàn)楦缚丶腇rame還沒有確定痊夭,子控件設(shè)置Frame不太好渐逃,我們應(yīng)該在layoutSubviews中設(shè)置Frame
 layoutSubviews (一定要調(diào)用父類) :
    當(dāng)一個(gè)控件的frame發(fā)生改變的時(shí)候調(diào)用,Frame前后要不一致
    將一個(gè)控件添加到當(dāng)前控件的時(shí)候調(diào)用

一液走、UITableViewCell重用的封裝

+ (instancetype)HeroCell:(UITableView *)tableView;{
    HeroTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ID"];
    if (!cell) {
        cell = [[HeroTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"ID"];
    }
    return cell;
}

二纲菌、UITableViewCell的封裝 - 系統(tǒng)自定義

#import <UIKit/UIKit.h>
@class Hero;
@interface HeroTableViewCell : UITableViewCell
+ (instancetype)HeroCell;
@property (nonatomic, strong) Hero *hero;
@end
#import "HeroTableViewCell.h"
#import "Hero.h"
@implementation HeroTableViewCell
+ (instancetype)HeroCell{
    HeroTableViewCell *cell = [[HeroTableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
    return cell;
}

- (void)setHero:(Hero *)hero{
    _hero = hero;
    self.imageView.image = [UIImage imageNamed:hero.icon];
    self.textLabel.text = hero.name;
    self.detailTextLabel.text = hero.intro;
}
@end

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    Hero *hero = self.heros[indexPath.row];
    HeroTableViewCell *cell = [HeroTableViewCell HeroCell];
    cell.hero = hero;
    return cell;
}

三焕议、UITableViewCell的封裝 - 動態(tài)單元格
1.動態(tài)單元格得使用UITableViewController

2.UITableViewController的動態(tài)單元格cell要寫自定義的UITableViewCell宝磨,從而通過UITableViewCell實(shí)現(xiàn)自定義

3.UITableViewCell -> AppViewCell的代碼實(shí)現(xiàn)

#import <UIKit/UIKit.h>
@class App;
@class AppViewCell;
/// 代理
@protocol AppViewCellDelegate <NSObject>
@optional
- (void)downloadBtnDidClick:(AppViewCell *)appViewCell;
@end

@interface AppViewCell : UITableViewCell
+ (instancetype) appViewCell:(UITableView *)tableView;
@property (nonatomic, strong) App *app;
/// 代理屬性
@property (nonatomic, assign) id<AppViewCellDelegate> delegate;
@end
#import "AppViewCell.h"
#import "App.h"

@interface AppViewCell ()
/// 屬性連線
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *nameView;
@property (weak, nonatomic) IBOutlet UILabel *detailView;
@property (weak, nonatomic) IBOutlet UIButton *downloadBtn;
@end

@implementation AppViewCell
- (IBAction)downloadBtnDidClick {
    /// 禁用下載按鈕
    self.downloadBtn.enabled = NO;
    /// 設(shè)置已下載
    self.app.isDownloaded = YES;
    /// 判斷代理是否實(shí)現(xiàn)了代理方法
    if ([self.delegate respondsToSelector:@selector(downloadBtnDidClick:)]) {
        [self.delegate downloadBtnDidClick:self];
    }
}

+ (instancetype)appViewCell:(UITableView *)tableView{
    //dequeueReusableCellWithIdentifier會從緩存中創(chuàng)建Cell,但是如果緩存中沒有可重用的cell,則查詢系統(tǒng)的cell原型,通過原型創(chuàng)建cell,.沒有原型則報(bào)錯(cuò):
    AppViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"app"];
    return cell;
}

- (void)setApp:(App *)app{
    _app = app;
    self.iconView.image = [UIImage imageNamed:app.icon];
    self.nameView.text = app.name;
    self.detailView.text=[NSString stringWithFormat:@"大兄寻病:%@M懊烤,下載數(shù)量:%@",app.size,app.download];
    self.downloadBtn.enabled = !app.isDownloaded;
}
@end

四、UITableViewCell的封裝 - xib
1.xib名和UITableViewCell名一般相同
2.xib中的控件要進(jìn)行屬性連線
3.代碼實(shí)現(xiàn)

#import <UIKit/UIKit.h>
@class CZTg;

@interface CZTgCell : UITableViewCell
//返回當(dāng)前自定義的cell
+ (instancetype) tgCell:(UITableView *)tableView;
//為當(dāng)前自定義cell賦值
@property (nonatomic,strong) CZTg *tg;

@end
#import "CZTgCell.h"
#import "CZTg.h"

@interface CZTgCell()
@property (weak, nonatomic) IBOutlet UIImageView *iconView;
@property (weak, nonatomic) IBOutlet UILabel *titleView;
@property (weak, nonatomic) IBOutlet UILabel *priceView;
@property (weak, nonatomic) IBOutlet UILabel *buyCountView;
@end
@implementation CZTgCell

//創(chuàng)建自定義cell
+ (instancetype)tgCell:(UITableView *)tableView
{
    //1.定義重用標(biāo)識
    NSString *ID=@"tg";
    //2.從緩存中創(chuàng)建cell
    CZTgCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
    //3.判斷是否成功創(chuàng)建出cell,如果沒有就自己從Xib中創(chuàng)建
    if (cell==nil) {
        NSLog(@"aaaaaaa");
        cell=[[[NSBundle mainBundle] loadNibNamed:@"CZTgCell" owner:self options:nil] lastObject];
    }
    return  cell;
}

- (void)setTg:(CZTg *)tg
{
    _tg=tg;
    self.iconView.image=[UIImage imageNamed:tg.icon];
    self.titleView.text=tg.title;
    self.priceView.text=[NSString stringWithFormat:@"¥%@",tg.price];
    self.buyCountView.text=[NSString stringWithFormat:@"%@人已購買",tg.buyCount];
}
@end

五宽堆、UITableViewCell的封裝 - 純代碼
1.思路:
1.1重寫UITableViewCell的initWithStyle方法(記得先super父類方法)腌紧,在方法中新建控件并添加到cell中,再設(shè)置控件的屬性值
1.2在-(void)setMessageFrame方法中設(shè)置數(shù)據(jù)
1.3在-(void)layoutSubviews中設(shè)置Frame (layoutSubviews是在子控件添加到父類的時(shí)候會調(diào)用)
2.控件的Frame已經(jīng)在模型中實(shí)現(xiàn)了畜隶,所以cell就不需要再設(shè)置Frame
3.代碼的實(shí)現(xiàn):

#import <UIKit/UIKit.h>
@class CZMessageCellFrame;

@interface CZMessageCell : UITableViewCell
+ (instancetype) messageCell:(UITableView *)tableView;

@property (nonatomic,strong) CZMessageCellFrame *messageFrame;
@end
#import "CZMessageCell.h"
#import "CZMessage.h"
#import "CZMessageCellFrame.h"

@interface CZMessageCell ()
@property (nonatomic,weak) UILabel *timeView;
@property (nonatomic,weak) UIImageView *iconView;
@property (nonatomic,weak) UIButton *textView;
@end

@implementation CZMessageCell

+ (instancetype) messageCell:(UITableView *)tableView
{
    NSString *ID=@"QQ";
    CZMessageCell *cell=[tableView dequeueReusableCellWithIdentifier:ID];
    if (cell==nil) {
        //這個(gè)方法是父類的方法壁肋,也就意味著它只能創(chuàng)建出父類中默認(rèn)的系統(tǒng)自帶的cell.而不能滿足我們的需要,所以我們就需要做重寫籽慢,在調(diào)用方法的時(shí)候調(diào)用我們子類自己重寫過后的方法浸遗。
        cell=[[CZMessageCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:ID];
    }
    return  cell;
}
//根據(jù)多態(tài),系統(tǒng)會根據(jù)類型調(diào)用子類重寫過后的方法
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    //1.先初始化父類成員
    self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        //1.添加timeView
        UILabel *timeView=[[UILabel alloc] init];
        self.timeView=timeView;
        //設(shè)置居中
        timeView.textAlignment=NSTextAlignmentCenter;
        timeView.font=[UIFont systemFontOfSize:13];
        timeView.textColor=[UIColor lightGrayColor];
        [self addSubview:timeView];
        //2.添加iconView
        UIImageView *iconView=[[UIImageView alloc] init];
        self.iconView=iconView;
        [self addSubview:iconView];
        //3.添加textView
        UIButton *textView=[[UIButton alloc] init];
        self.textView=textView;
        //設(shè)置按鈕的文本色
        [textView setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
        //設(shè)置按鈕的字體大小
        textView.titleLabel.font=[UIFont systemFontOfSize:14];
        //設(shè)置自動換行
        textView.titleLabel.numberOfLines=0;
        //為按鈕添加內(nèi)容的內(nèi)間距
        textView.contentEdgeInsets=UIEdgeInsetsMake(0, 20, 0, 20);
        //為按鈕添加背景色
        //textView.backgroundColor=[UIColor redColor];
        [self addSubview:textView];
    }
    return self;
}

- (void)setMessageFrame:(CZMessageCellFrame *)messageFrame
{
    _messageFrame=messageFrame;
    //設(shè)置數(shù)據(jù)
    [self setDatas];
}
//設(shè)置數(shù)據(jù)
- (void) setDatas
{
    CZMessage *msg=self.messageFrame.message;

    self.timeView.text=msg.time;

    if (msg.type==MessageTypeMe) {
        self.iconView.image=[UIImage imageNamed:@"me"];
        //根據(jù)消息類型設(shè)置消息文本的背景圖片
        [self.textView setBackgroundImage:[self resizeImageWithName:@"chat_send_nor"] forState:UIControlStateNormal];
        [self.textView setBackgroundImage:[self resizeImageWithName:@"chat_send_press_pic"] forState:UIControlStateHighlighted];
    }
    else
    {
        self.iconView.image=[UIImage imageNamed:@"other"];
        [self.textView setBackgroundImage:[self resizeImageWithName:@"chat_recive_nor"] forState:UIControlStateNormal];
        [self.textView setBackgroundImage:[self resizeImageWithName:@"chat_recive_press_pic"] forState:UIControlStateHighlighted];
    }
    [self.textView setTitle:msg.text forState:UIControlStateNormal];

}

//返回拉伸之后的圖片
- (UIImage *) resizeImageWithName:(NSString *)name
{
    return [[UIImage imageNamed:name] resizableImageWithCapInsets:UIEdgeInsetsMake(30, 20, 18, 30) resizingMode:UIImageResizingModeStretch];
}

//當(dāng)將當(dāng)前控件添加到父容器的時(shí)候箱亿,自動調(diào)用這個(gè)方法跛锌,設(shè)置它的子控件的Frame
//如現(xiàn)在這個(gè)情況:當(dāng)創(chuàng)建好cell,添加到tableView中的時(shí)候,會調(diào)用這個(gè)方法設(shè)置cell 的三個(gè)子控件的frame
- (void) layoutSubviews
{
    //判斷是否需要顯示時(shí)間
    self.timeView.hidden=! self.messageFrame.showTime;
    self.timeView.frame=self.messageFrame.timeViewF;
    self.iconView.frame=self.messageFrame.iconViewF;
    self.textView.frame=self.messageFrame.textViewF;
}
@end
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末届惋,一起剝皮案震驚了整個(gè)濱河市髓帽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脑豹,老刑警劉巖郑藏,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘩欺,居然都是意外死亡必盖,警方通過查閱死者的電腦和手機(jī)拌牲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來歌粥,“玉大人塌忽,你說我怎么就攤上這事∈唬” “怎么了土居?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長突勇。 經(jīng)常有香客問我,道長坷虑,這世上最難降的妖魔是什么甲馋? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮迄损,結(jié)果婚禮上定躏,老公的妹妹穿的比我還像新娘。我一直安慰自己芹敌,他們只是感情好痊远,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著氏捞,像睡著了一般碧聪。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上液茎,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天逞姿,我揣著相機(jī)與錄音,去河邊找鬼捆等。 笑死滞造,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的栋烤。 我是一名探鬼主播谒养,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼明郭!你這毒婦竟也來了买窟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤薯定,失蹤者是張志新(化名)和其女友劉穎蔑祟,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沉唠,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疆虚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片径簿。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡罢屈,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出篇亭,到底是詐尸還是另有隱情缠捌,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布译蒂,位于F島的核電站曼月,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏柔昼。R本人自食惡果不足惜哑芹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捕透。 院中可真熱鬧聪姿,春花似錦、人聲如沸乙嘀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽虎谢。三九已至盟榴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間婴噩,已是汗流浹背曹货。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讳推,地道東北人顶籽。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像银觅,于是被迫代替她去往敵國和親礼饱。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫究驴、插件镊绪、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • UITableViewCell 父類是UIView UITableView的每一行都是一個(gè)UITableViewC...
    翻這個(gè)墻閱讀 6,578評論 0 1
  • 1.屬性readwrite,readonly洒忧,assign蝴韭,retain,copy熙侍,nonatomic 各是什么作...
    曾令偉閱讀 1,048評論 0 10
  • 一大早朋友打電話送來幾張票:“今晚七點(diǎn)榄鉴,來看我們縣的春晚履磨!” 盡管不是演員,到現(xiàn)場的那一刻也是無比激動的:絢麗的舞...
    時(shí)光呵閱讀 147評論 0 0
  • 半夜 生物鐘把我鬧醒 床頭迷籠的光 黑夜里充盈的瞳眸 母親這疲累卑小的身份 時(shí)常驕傲里填滿喪氣 時(shí)常心安里澆灌惶恐...
    半壁殘?jiān)?/span>閱讀 318評論 2 4