首页 > 代码库 > tableView用法----博客状态案例

tableView用法----博客状态案例

小烨子这两天课比较紧,晚上回来网又打不开网页,苦逼啊,趁现在可以用赶紧写
好了不瞎扯了

自定义微博步骤:
1.观察应用,分析功能,了解答题流程
2.加载plist取出数据,同时建立模型储存到数组中,因为这是个自定义cell,每个cell的高度都是由cell里面内容确定的,但是要设置cell的高度就要的hi用代理的的这个方法:
-  (CGFloat)tableVIew:(UITableView *) heightForRowAtIndexPath:(NSIndexPath *)IndexPath
问题来了,我们要设置cell的内容就需要在创建cell的方法里将对象赋值过去,但是设置高度的方法是在创建cell方法之前调用的,这个时候我们还不知道cell的内容。怎么办?
其实我们写到后面就发现了,计算cell高度只需要plist里取出的数据就可以了,我们要加里一个Frame模型,用来记录各个控件的宽高,计算出cell的高度,在这个Frame模型里包含一个weibo的基础模型之后,我么就可以在之后的传值的时候传递这个Frame模型就可以了
/**
 *  
懒加载数据模型
 */

- (
NSArray *)weibos
{
    
// 懒加载一定要判断防止重复加载
    
if (!_weibos) {
        
NSString *path = [[NSBundle mainBundlepathForResource:@"statuses.plist" ofType:nil];
        
NSArray *array = [NSArray arrayWithContentsOfFile:path];
        
// 数据转模型
        
NSMutableArray *modle = [NSMutableArray arrayWithCapacity:array.count];
        
for (NSDictionary *dict in array) {
            
LYweiboFrame *weiboFrame = [[LYweiboFrame allocinit];
            weiboFrame.
weibo = [LYWeibo weiboWithDictionaty:dict];
            [modle 
addObject:weiboFrame];
        }
        
self.weibos = [modle copy];
    }
    
return _weibos;

}
3.
创建weibocellView
在这个cell初始化的时候,将需要的控件加上去,这里有需要注意的
自定义cellVIew里面使用的初始化方法是:init方法
如果是Xib创建的cell,那么初始化方法是:
initWithCoder:和:
awakeFromNib
这一点是需要注意的
4.现在什么都有了,就剩下填充数据了。在CellVIew里面写一个方法,将传过去模型的数据,填充到建立的各个控件里去就可以了。

 

上代码:

LYViewController.m

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
//
//  LYViewController.m
//  TG小项目
//
//  Created by liye on 14-5-28.
//  Copyright (c) 2014年 heima. All rights reserved.
//
 
#import "LYViewController.h"
#import "LYTgModel.h"
#import "LYCellView.h"
#import "LYFooterView.h"
#import "LYHeadderView.h"
 
 
@interface LYViewController ()<UITableViewDataSource, LYFooterViewDelegate>
/**
 *  - tableView
 */
@property (weak, nonatomic) IBOutlet UITableView *tableView;
/**
 *  - 懒加载数组
 */
@property (strong, nonatomic) NSMutableArray *tgs;
@end
 
@implementation LYViewController
 
#pragma mark 代理方法
- (void)footViewLoadMoreBtn:(LYFooterView *)footerView
{
    LYTgModel *newTg = [[LYTgModel alloc] init];
    newTg.title = @"一家人快餐";
    newTg.price = @"¥9.9";
    newTg.buyCount = @"0";
    // 添加数据
    [self.tgs addObject:newTg];
    // 刷新数据
    [self.tableView reloadData];
}
 
#pragma mark viewDidLoad
- (void)viewDidLoad
{
    [super viewDidLoad];
    // 设置底部视图
    LYFooterView *footerView = [LYFooterView footerView];
    // 设置底部视图代理
    footerView.delegate = self;
    self.tableView.tableFooterView = footerView;
    // 设置顶部视图
    LYHeadderView *headderView = [LYHeadderView headderView];
    self.tableView.tableHeaderView = headderView;
     
}
 
 
#pragma mark -tableView
/**
 *  tableView返回多少组
 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}
/**
 *  每组多少行
 */
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.tgs.count;
}
/**
 *  每行的数据
 */
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 创建cell
    LYCellView *cell = [LYCellView addCell:tableView];
    // 设置cell
    cell.tg = self.tgs[indexPath.row];
    // 返回cell
    return cell;
}
 
#pragma mark 去掉状态栏
- (BOOL)prefersStatusBarHidden
{
    return YES;
}
 
#pragma mark -懒加载数据
- (NSArray *)tgs
{
    // 懒加载一定要判断防止重复加载
    if (!_tgs) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil];
        NSArray *array = [NSArray arrayWithContentsOfFile:path];
        // 数据转模型
        NSMutableArray *modle = [NSMutableArray arrayWithCapacity:array.count];
        for (NSDictionary *dict in array) {
            [modle addObject:[LYTgModel tgWithDictionaty:dict]];
        }
        self.tgs = [modle mutableCopy];
    }
    return _tgs;
}
 
@end

 创建模型(先引入一个宏)

LYGolbal.h

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//
//  LYGolbal.h
//  UITable练习
//
//  Created by liye on 14-5-27.
//  Copyright (c) 2014年 heima. All rights reserved.
//
 
#ifndef UITable___LYGolbal_h
#define UITable___LYGolbal_h
 
#define LYinitH(name) \
- (instancetype)initHeroWithDictionary:(NSDictionary *)dict;\
+ (instancetype)name##WithDictionaty:(NSDictionary *)dict;
 
#define LYinitM(name)\
- (instancetype)initHeroWithDictionary:(NSDictionary *)dict\
{\
if (self = [super init]) {\
[self setValuesForKeysWithDictionary:dict];\
}\
return self;\
}\
+ (instancetype)name##WithDictionaty:(NSDictionary *)dict\
{\
return [[self alloc] initHeroWithDictionary:dict];\
}
 
#endif

 建立模型

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import <Foundation/Foundation.h>
#import "LYGolbal.h"
 
@interface LYTgModel : NSObject
 
@property (nonatomic, copy) NSString *title;
 
@property (nonatomic, copy) NSString *buyCount;
 
@property (nonatomic, copy) NSString *icon;
 
@property (nonatomic, copy) NSString *price;
 
LYinitH(tg);
 
@end
 
 
 
 
#import "LYTgModel.h"
#import "LYGolbal.h"
 
@implementation LYTgModel
 
LYinitM(tg);
 
@end

 CellView:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#import <UIKit/UIKit.h>
 
@class LYTgModel;
 
@interface LYCellView : UITableViewCell
 
@property (strong, nonatomic) LYTgModel *tg;
 
 
+ (instancetype)addCell:(UITableView *)tableView;
 
 
@end
 
 
 
#import "LYCellView.h"
#import "LYTgModel.h"
 
@interface LYCellView ()
 
@property (weak, nonatomic) IBOutlet UILabel *titleLabel;
 
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
 
@property (weak, nonatomic) IBOutlet UILabel *buyCount;
 
@property (weak, nonatomic) IBOutlet UIImageView *cellImageView;
 
@end
 
@implementation LYCellView
 
+ (instancetype)addCell:(UITableView *)tableView
{
    // cell标记
    NSString *cellMark = @"tg";
    // 从缓存中取出cell
    LYCellView *cell = [tableView dequeueReusableCellWithIdentifier:cellMark];
    // 判断是否存在cell
    if (!cell) {
        cell = [[NSBundle mainBundle] loadNibNamed:@"LYCellView" owner:nil options:nil][0];
    }
    return cell;
}
 
- (void)setTg:(LYTgModel *)tg
{
    if (self) {
        self.cellImageView.image = [UIImage imageNamed:tg.icon];
        self.titleLabel.text = tg.title;
        self.priceLabel.text = [NSString stringWithFormat:@"¥%@", tg.price];
        self.buyCount.text = [NSString stringWithFormat:@"%@已购买", tg.buyCount];
    }
}
@end

 靠,xib文件怎么搞

算了,你们自己建把,这里需要一个LYCellView.xib

LYheadderView

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#import <UIKit/UIKit.h>
 
@interface LYHeadderView : UIView <UIScrollViewDelegate>
 
+ (LYHeadderView *)headderView;
 
@end
 
 
 
#define kImageCount 5
#define kWidth 300
#define kHeight 140
 
#import "LYHeadderView.h"
 
@interface LYHeadderView ()
 
@property (weak, nonatomic) IBOutlet UIScrollView *headScrollView;
 
@property (weak, nonatomic) IBOutlet UIPageControl *pageNumber;
 
@property (strong, nonatomic) NSTimer *timer;
@end
 
@implementation LYHeadderView
 
/**
 * 添加视图headderView
 */
+ (LYHeadderView *)headderView
{
    // 从Bundle中取出
    NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"LYHeadderView" owner:nil options:nil];
    return array[0];
}
 
/**
 *  为视图添加数据
 */
- (void)awakeFromNib
{
    for (int i = 0; i < kImageCount; i ++) {
        UIImageView *headderImageView = [[UIImageView alloc] init];
        headderImageView.frame = CGRectMake(i * kWidth, 0, kWidth, kHeight);
        NSString *imageName = [NSString stringWithFormat:@"ad_%02d", i];
        headderImageView.image = [UIImage imageNamed:imageName];
        [self.headScrollView addSubview:headderImageView];
    }
    // 滚动效果
    self.headScrollView.contentSize = CGSizeMake(kImageCount * kWidth, kHeight);
    // 取消垂直方向的滚动条
    self.headScrollView.showsVerticalScrollIndicator = NO;
    // 半自动分页
    self.headScrollView.pagingEnabled = YES;
    // 设置代理
    self.headScrollView.delegate = self;
    // 自动播放
    [self startTimer];
}
 
#pragma mark 代理方法
- (void)nextImage
{
    if (self.pageNumber.currentPage == kImageCount - 1) {
        self.pageNumber.currentPage = 0;
    }else{
        self.pageNumber.currentPage ++;
    }
     
    CGFloat currentX = kWidth * (self.pageNumber.currentPage);
    [self.headScrollView setContentOffset:CGPointMake(currentX, 0) animated:YES];
}
// 只要图片滚动,就会计算图片当前页数
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (!self.timer) {
        // 设置图片页数
        CGFloat currentX = self.headScrollView.contentOffset.x;
        self.pageNumber.currentPage = (currentX + kWidth * 0.5) / kWidth;
    }
}
// 拖动时,关闭计时器
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.timer invalidate];
    self.timer = nil;
}
// 结束拖动,开始计时器
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    [self startTimer];
}
 
// 开启计时器方法
- (void)startTimer
{
    self.timer = [NSTimer timerWithTimeInterval:1.f target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
 
@end

 这里需要一个LYHeadderView.xib

LYFooterView

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#import <UIKit/UIKit.h>
 
@class LYFooterView;
@protocol LYFooterViewDelegate <NSObject>
 
@optional
- (void)footViewLoadMoreBtn:(LYFooterView *)footerView;
 
@end
 
@interface LYFooterView : UIView
 
@property (strong, nonatomic) id<LYFooterViewDelegate> delegate;
 
+ (instancetype)footerView;
 
@end
 
 
#import "LYFooterView.h"
 
@interface LYFooterView()
 
@property (weak, nonatomic) IBOutlet UIButton *loadMoreBtn;
@property (weak, nonatomic) IBOutlet UIView *hiddenView;
 
@end
 
@implementation LYFooterView
 
+ (instancetype)footerView
{
    return [[NSBundle mainBundle] loadNibNamed:@"LYFooterView" owner:nil options:nil][0];
}
 
/**
 *  按钮点击事件
 */
- (IBAction)loadMoreBtnClick
{
    NSLog(@"加一个");
    // HiddenView显示,Button隐藏
    self.hiddenView.hidden = NO;
    self.loadMoreBtn.hidden = YES;
     
    // 代理添加一条数据
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        // 使用代理
        if ([self.delegate respondsToSelector:@selector(footViewLoadMoreBtn:)]) {
            [self.delegate footViewLoadMoreBtn:self];
        }
         
        // HiddenView隐藏,Button显示
        self.hiddenView.hidden = YES;
        self.loadMoreBtn.hidden = NO;
    });
}
 
@end

 小叶子是小白,只是在这里回顾一下流程,巩固知识