通过xib和代码自定义cell

一、通过xib自定义cell
1、自定义根源 :默认的UITableCell的内容是固定的。当自带的cell不满足需求时,并且cell的内容是固定的,就可以通过xib来自定义cell。如果不固定就需要手动代码来自定义cell。
2、当你新建一个项目时,你的控制器继承自NSObject协议。但可以自定义一个控制器,继承字UITableVIewController。这样的话你的类的内部就实现了代理数据源协议,并且自带一些必须的方法。
3、如何自定义xib及加载,新建一个empty定义为名.xib文件,拖一个UItableVIewCell控件,在上面拖三个UILable一个UIImageVIew。如果想让UILable自动换行让lines等于1。加载控件有两种方式1UItableVIewCell *cell = [[NSBundle mainBundle] loadNibNamed: owner: option:][0]加载之后是一个数组,调用第一个返回的就是你创建的xib的主控件。2.UINib *nib = [UINib nibWithNIbName:@“hello" bundle:[UIbundle mainBundle]];调用nib的方法返回,nib类中一共就三个方法。如果需要重用,需要在xib文件中给indentifier赋值,在尖尖的尖头那栏,这样就实现了。
4、设置cell的高度有两种方式,一种是代理方法,一种是tableview自带属性rowheight。
5、通过模型将plist文件里的字典转换成模型,字典转换后的都是对象,当赋值给基本数据类型时,进行intValue的转换等。通过加载已经拥有了cell,但需要给cell里面的每一个控件赋值,如何做,1绑定tag不可取。2、把xib封装成模型,但要注意,模型要继承对应xib的空间类型,比如继承UITableViewCell类。但如何让xib和类文件有关联呢。但需要设置xib文件的class类型为控件类。class为什么类型创建出来的对象就是什么类型的,然后通过连线讲内部子控件连起来,创建cell的时候,可以把上面的两种加载文件的方法封装到类内部,class只能设置当前类型及其子类。控件模型的属性控件用weak。
6、最后把数据模型也封装到xib模型内部,在set方法里给控件的属性负赋值。
7、下面的代码没有xib文件,xib文件需要做的。1创建empty文件。2拖控件。3设置identifer。 4设置class。 5与xib模型属性联系。

xib模型

#import <UIKit/UIKit.h>xib

#import "Data.h"

@interface Cell : UITableViewCell

@property (nonatomic,weak) IBOutletUILabel *desc;控件类型的成员变量

@property (nonatomic,weak) IBOutletUILabel *name;

@property (nonatomic,weak) IBOutletUIImageView *icon;

@property (nonatomic,strong) Data *data;数据模型,用来给上面的空间的属性赋值

+(id)newCell;类方法创建cell

+(NSString *)reuseId;把reuse主键封装到模型内部

@end

#import "Cell.h"

@implementation Cell

+(id)newCell{创建方法就是通过bundle加载文件

    return  [[NSBundlemainBundle] loadNibNamed:@"cell"owner:niloptions:nil][0];

}

+(NSString *)reuseId{

return @"cell";

}

-(void)setData:(Data *)data{通过set方法给控件内的属性赋值,注意很好的思想

    _data = data;

    _desc.text = data.desc;

    _name.text = data.name;

    _icon.image = [UIImageimageNamed:data.icon];

}

@end


数据模型

#import <Foundation/Foundation.h>数据模型很简单就是普通的文件,但要和xib模型文件关联,这里的数据最终要射入到xib模型内部

@interface Data : NSObject

@property (nonatomic,copy) NSString *desc;

@property (nonatomic,copy) NSString *icon;

@property (nonatomic,copy) NSString *name;

-(id) initWithDesc:(NSString *)desc withIcon:(NSString *)icon withName:(NSString *)name;

- (id)initWithDictionary:(NSDictionary *)dictionary;讲plist文件内的dictionary封装成模型

@end

#import "Data.h"

@implementation Data

- (id)initWithDesc:(NSString *)desc withIcon:(NSString *)icon withName:(NSString *)name{

    if (self = [superinit]) {

        _desc = desc;

        _icon = icon;

        _name = name;

    }

    return  self;

}

- (id)initWithDictionary:(NSDictionary *)dictionary{

    if (self = [superinit]) {

        _name = dictionary[@"name"];

        _desc = dictionary[@"desc"];

       _icon = dictionary[@"icon];返回的都是对象,如果是基本数据类型则需要转换

    }

    return  self;

}

@end


控制器代码

#import "ViewController.h"

#import "Data.h"

#import "Cell.h"

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>

{

    NSMutableArray *_modelArray;全局数据模型

}

@end

@implementation ViewController

- (void)viewDidLoad {

    [superviewDidLoad];通过bundle获取文件路径

    NSString *path = [[NSBundlemainBundle] pathForResource:@"shops.plist"ofType:nil];

    NSArray *array = [NSArray arrayWithContentsOfFile:path];返回数组,通过数组的方法加载文件路径

    _modelArray = [NSMutableArrayarray];这里要注意,一定要初始化,要不怎么性,编译器不会抱错

    [array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        Data *data = [[Data alloc] initWithDictionary:obj];

        [_modelArrayaddObject:data];

    }];

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

    return _modelArray.count;返回一共有多少行,每一次的reload都是调用的方法

}

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

    tableView.rowHeight =104;设置tableview的高度

    Cell *cell = [tableViewdequeueReusableCellWithIdentifier:[CellreuseId]];先从缓冲池中取,取不到在创建

    if (cell == nil) {

        cell =[CellnewCell];把创建方法封装到模型内部

    }

    cell.data =_modelArray[indexPath.row];给xib模型的数据属性赋值,通过数据属性的set方法给模型的属性赋值

    return cell;

}

@end






















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值