[10]UITableView表示图2 自适应高度

本篇文章我们使用plist文件
先引入一个plist文件的读取

//设置一个字符串读取文件路径
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"plist"];
//通过文件路径存入到数组
NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];

由于我们的plist文件是数据学生信息,我们可以先一个学生类数据,来跟plist数据里的字典类型数据相匹配,注意的是 我们建的Person数据类要跟字典中的key相匹配,还有我们要修改cell的样式,我们可以选择继承于UITabelViewCell,重写初始化方法来自定义布局,

我们新建数据类如下Person,personCell1,由于我们只是用来建造数据类型,只需要建我们需要的属性,和处理内存释放就可以了.

//.h文件
@interface Person : NSObject

@property (nonatomic,retain) NSString *icon;
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *phoneNumber;
@property (nonatomic,retain) NSString *sex;
@property (nonatomic,retain) NSString *introduce;
@end
//.m文件
@implementation Person

-(void)dealloc
{
    [_icon release];
    [_name release];
    [_phoneNumber release];
    [_introduce release];
    [_sex release];
    [super dealloc];

}

-(void)setValue:(id)value forUndefinedKey:(NSString *)key
{

}
//上下俩个 是取值 和 过来没有key的值值
- (id)valueForUndefinedKey:(NSString *)key
{
    return nil;
}
@end

我们新建的cell类,继承于UITableViewCell

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

@interface PersonCell1 : UITableViewCell

@property (nonatomic,readonly,retain) UIImageView *headImageView;
@property (nonatomic,retain,readonly) UILabel *nameLabel;
@property (nonatomic,retain,readonly) UILabel *phoneLabel;
@property (nonatomic,retain,readonly) UILabel *introduceLabel;


@property (nonatomic,retain) Person *person;


//实现自适应高度,我们自己添加一个求cell的高度的方法
+ (CGFloat)cellHieghtForPerson:(Person *)p;

@end


//.m文件中的
#import "PersonCell1.h"
#import "Person.h"
//由于这个方法我们只写在了本类中,我们定义为+方法,切写延展中,主要是外面也用不到
@interface PersonCell1 ()
//创建一个方法用来获得文本框的高度用的
+ (CGFloat )heightForString:(NSString *)str;

@end

@implementation PersonCell1

-(void)dealloc
{
    [_nameLabel release];
    [_introduceLabel release];
    [_person release];
    [_phoneLabel release];
    [_headImageView release];
    [super dealloc];
}
//重写UITableViewCell的初始化方法,并在里面给我们的空间定好位置布局
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _headImageView = [[UIImageView alloc] initWithFrame:CGRectMake(10, 10, 80, 120)];
        [self.contentView addSubview:_headImageView];
        
        _nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 10, 210, 20)];
        [self.contentView addSubview:_nameLabel];
        
        _phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 35, 210, 20)];
        [self.contentView addSubview:_phoneLabel];
        
        _introduceLabel = [[UILabel alloc] initWithFrame:CGRectMake(100, 60, 210, 70)];
        _introduceLabel.font = [UIFont systemFontOfSize:18];
        _introduceLabel.numberOfLines = 0;
        [self.contentView addSubview:_introduceLabel];
        
    }
    
    return  self;
}
//重写person属性的set方法,懒加载的方式再里面进行数据的匹配,让我们控件要显示的文本和Person类的属性一一对应起来
-(void)setPerson:(Person *)person
{
    if (_person != person) {
        [_person release];
        
        _person = [person retain];
        _headImageView.image = [UIImage imageNamed:person.icon];
        _nameLabel.text = person.name;
        _phoneLabel.text = person.phoneNumber;
        _introduceLabel.text = person.introduce;
        _introduceLabel.frame = CGRectMake(100, 60, 210, [PersonCell1 heightForString:person.introduce]);
        
    }

}

//计算文本框的高度
+ (CGFloat )heightForString:(NSString *)str
{

    NSDictionary *dic = [[NSDictionary alloc] initWithObjectsAndKeys:[UIFont systemFontOfSize:18],NSFontAttributeName, nil];
    
    CGRect rect = [str boundingRectWithSize:CGSizeMake(210, 1000) options:NSStringDrawingUsesLineFragmentOrigin attributes:dic context:nil];
    
    return rect.size.height;
}
//计算cell的高度
+ (CGFloat)cellHieghtForPerson:(Person *)p
{
    //自我介绍label的y值加上自我介绍label的height 加上 最下面那块空白区域
    CGFloat height = 60 + [PersonCell1 heightForString:p.introduce]+10;
    return height > 140 ? height:140;
}
//以下为cell自带的方法
- (void)awakeFromNib {
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

现在要给我们需要的根视图控制器结合,RootViewController

#import <UIKit/UIKit.h>
//接受这俩个协议,只要是使用UITabelView基本上都会使用这俩
@interface RootViewController : UIViewController<UITableViewDataSource,UITableViewDelegate>
//可变数组存放我们plist文件中的数据 只不过是用来先把原数据转换后存入的
@property (nonatomic,retain) NSMutableArray *persons;
//tableView表示图 设置为属性,方便使用
@property (nonatomic,retain) UITableView *tableView;

@end



//.m文件中

#import "RootViewController.h"
#import "Person.h"
#import "PersonCell1.h"
#import "PersonCell2.h"

@interface RootViewController ()

@end

@implementation RootViewController
-(void)dealloc
{
    [_persons release];
    [_tableView release];
    [super dealloc];
}

-(void)loadView
{
    //初始化
    _tableView = [[UITableView alloc] initWithFrame:[UIScreen mainScreen].bounds style:UITableViewStylePlain];
    //设置显示条的颜色
    _tableView.separatorColor = [UIColor redColor];
    //接收俩个代理
    _tableView.delegate = self;
    _tableView.dataSource = self;
    self.view = _tableView;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"Students" ofType:@"plist"];
    
    NSArray *array = [[NSArray alloc] initWithContentsOfFile:filePath];
    //persons可变数组初始化开辟空间,这部不可省略!!!
    _persons = [[NSMutableArray alloc] initWithCapacity:[array count]];
    //通过forin快速遍历,把plist的文件转化成我们想要的person类型
    for (NSDictionary *dic in array) {
        Person *person = [[Person alloc] init];
        //kvc的一种模式 直接把字典转换,但是 person的属性设置 和 key一定要匹配 如果我们写的key值没有全部引用我们要在后面加方法
        [person setValuesForKeysWithDictionary:dic];
        
        [_persons addObject:person];
        [person release];
    }
    [array release];
}
//控制器中原有的警告方法
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//返回行高的方法 也就是代理中的方法
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Person * p = _persons[indexPath.row];
    if ([p.sex isEqualToString:@"女"] ) {
        return [PersonCell2 cellHieghtForPerson:_persons[indexPath.row]];
    }
    else
    {
    return  [PersonCell1 cellHieghtForPerson:_persons[indexPath.row]];
    }
}
//处理数据的代理中必须执行的方法之一,返回多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [_persons count];
}
//处理数据的代理中必须要执行的方法之一,给我们的cell设值的方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Person *p = _persons[indexPath.row];
    if ([p.sex isEqual:@"女"]) {
        
        static NSString *resueIdentifier = @"person2";
        PersonCell2 *cell2 = [tableView dequeueReusableHeaderFooterViewWithIdentifier:resueIdentifier];
        
        if (cell2 == nil) {
            cell2 = [[[PersonCell2 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:resueIdentifier] autorelease];
        }
        cell2.person = _persons[indexPath.row];
        return cell2;
    }
    else
    {
        static NSString *resueIdentifier = @"person1";
        PersonCell1 *cell1 = [tableView dequeueReusableHeaderFooterViewWithIdentifier:resueIdentifier];
        
        if (cell1 == nil) {
            cell1 = [[[PersonCell1 alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:resueIdentifier] autorelease];
        }
        cell1.person = _persons[indexPath.row];
         return cell1;
    }
}

@end

转载于:https://www.cnblogs.com/ianhao/p/4471817.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值