隨著日常的使用,系統提供的cell已經不能滿足開發的需要,因為系統提供的是單一的,所以 這就引來了自定義cell的出現,可以根據 自己的需要來佈局各個控制項所處的位置。不同位置顯示不同的控制項。 創建一個類,繼承於UITableCell. 自定義cell,簡單的來說可以分為三步 1.將所有cell要顯示
隨著日常的使用,系統提供的cell已經不能滿足開發的需要,因為系統提供的是單一的,所以 這就引來了自定義cell的出現,可以根據 自己的需要來佈局各個控制項所處的位置。不同位置顯示不同的控制項。
創建一個類,繼承於UITableCell.
自定義cell,簡單的來說可以分為三步
1.將所有cell要顯示的子視圖控制項聲明成屬性
@interface MyTableViewCell : UITableViewCell @property (nonatomic, retain)UIImageView *headerImageView; //頭像 @property (nonatomic, retain)UILabel *nameLabel; // 姓名 @property (nonatomic, retain)UILabel *genderLabel; // 性別 @property (nonatomic, retain)UILabel *ageLabel; //年齡
2.重寫cell的初始化方法,frame給定為0,將控制項添加到cell上面進行顯示,一定要註意使用self.contentView添加
//CGRectZero表示0
//重寫cell的初始化方法 - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{ self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { [self setupSubviews]; } return self; } - (void)setupSubviews{ _headerImageView = [[UIImageView alloc] initWithFrame:CGRectZero]; _headerImageView.backgroundColor = [UIColor greenColor]; //自定義cell內部添加子視圖時,不能使用self,應該是使用self.contentView [self.contentView addSubview:_headerImageView]; _nameLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _nameLabel.backgroundColor = [UIColor grayColor]; [self.contentView addSubview:_nameLabel]; _genderLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _genderLabel.backgroundColor = [UIColor cyanColor]; [self.contentView addSubview:_genderLabel]; _ageLabel = [[UILabel alloc] initWithFrame:CGRectZero]; _ageLabel.backgroundColor = [UIColor yellowColor]; [self.contentView addSubview:_ageLabel]; }
3.重寫layouSubviews方法,給定內部控制項的具體位置
//指定內部控制項的大小 - (void)layoutSubviews{ [super layoutSubviews]; _headerImageView.frame = CGRectMake(5, 5, 50, 80); _nameLabel.frame = CGRectMake(65, 5, 150, 20); _genderLabel.frame = CGRectMake(65, 35, 150, 20); _ageLabel.frame = CGRectMake(65, 65, 150, 20); }
但如果想方便以後操作的話,可以在自定義cell的時候,使用到數據模型,方便賦值,取值。
1.導入模型,將模型與cell進行綁定,聲明模型屬性
//在cell內部綁定一個模型屬性 @property (nonatomic, retain)Student *stu;
2.重寫模型屬性的setter方法,內部使用模型為內部控制項賦值。
//重寫模型的setter方法,完成賦值 - (void)setStu:(Student *)stu{ if (_stu != stu) { _stu = [stu retain]; //為內部控制項進行賦值 _headerImageView.image = [UIImage imageNamed:_stu.picture]; _nameLabel.text = _stu.name; _genderLabel.text = _stu.gender; _ageLabel.text = _stu.age; } }
如果是在MRC環境下使用的話,一定要註意記憶體管理哦。
自定義cell的使用方法與系統提供的cell使用方法,沒有區別。
//cell顯示的內容,數據 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *reuseIdentifier = @"reuse"; MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseIdentifier]; if (cell == nil) { cell = [[[MyTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier]autorelease]; //cell.selectionStyle = UITableViewCellSelectionStyleNone; } //使用模型屬性來賦值 Student *student = _dataArray[indexPath.row]; cell.stu = student; // cell.nameLabel.text = student.name; // cell.ageLabel.text = student.age; // cell.genderLabel.text = student.gender; return cell; }
自定義cell,一個重點就是內部各控制項該怎麼樣佈局,控制項顯示的屬性有哪些、而怎麼樣局面,擺放的位置還是要自己設計清楚的。