ios基础控件 之展示团购数据 UITableViewCell <代理,xib封装view>

1.主控制器:

  1 //
  2 //  ViewController.m
  3 //  GroupPurchase
  4 //
  5 //  Created by hellovoidworld on 14/12/3.
  6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
  7 //
  8
  9 #import "ViewController.h"
 10 #import "GroupPurchase.h"
 11 #import "GroupPurchaseCell.h"
 12 #import "FooterRefreshView.h"
 13 #import "HeaderAdView.h"
 14
 15
 16 @interface ViewController () <FooterRefreshViewDelegate>
 17
 18 @property(nonatomic, strong) NSArray *groupPurchases;
 19
 20 @end
 21
 22 @implementation ViewController
 23
 24 - (void)viewDidLoad {
 25     [super viewDidLoad];
 26     // Do any additional setup after loading the view, typically from a nib.
 27
 28     // 创建尾部控件
 29     FooterRefreshView *footerView = [FooterRefreshView footerRrefreshViewWithDelegate:self];
 30
 31     // 设置尾部控件
 32     self.tableView.tableFooterView = footerView;
 33
 34
 35     //设置头部广告
 36     HeaderAdView *adView = [self genAdView]; // 手动拼装广告图片数据
 37     self.tableView.tableHeaderView = adView;
 38 }
 39
 40 - (void)didReceiveMemoryWarning {
 41     [super didReceiveMemoryWarning];
 42     // Dispose of any resources that can be recreated.
 43 }
 44
 45 #pragma mark - 状态栏
 46 - (BOOL)prefersStatusBarHidden {
 47     return YES;
 48 }
 49
 50
 51 #pragma mark - 数据方法
 52 /** 延迟数据加载到model */
 53 - (NSArray *) groupPurchases {
 54     if (nil == _groupPurchases) {
 55         NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil]];
 56
 57         NSMutableArray *mdictArray = [NSMutableArray array];
 58         for (NSDictionary *dict in dictArray) {
 59             GroupPurchase *groupPurchase = [GroupPurchase groupPurchaseWithDictionary:dict];
 60             [mdictArray addObject:groupPurchase];
 61         }
 62
 63         _groupPurchases = mdictArray;
 64     }
 65
 66     return _groupPurchases;
 67 }
 68
 69 /** section数 */
 70 - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 71     return 1;
 72 }
 73
 74 /** 行数 */
 75 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 76     return self.groupPurchases.count;
 77 }
 78
 79 /** 内容 */
 80 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 81
 82     // 1.创建cell
 83     GroupPurchaseCell *cell = [GroupPurchaseCell groupPurchaseCellWithTableView:self.tableView];
 84
 85     // 2.给cell传递model数据
 86     cell.groupPurchase = self.groupPurchases[indexPath.row];
 87
 88     return cell;
 89 }
 90
 91 /** 行高 */
 92 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 93     return 80;
 94 }
 95
 96 /** 实现FooterRefreshViewDelegate协议 */
 97 - (void)footerRefreshViewClickedFooterRefreshButton:(FooterRefreshView *)footerRefreshView {
 98     //增加团购记录
 99     GroupPurchase *groupPurchase = [GroupPurchase groupPurchase];
100     groupPurchase.icon = @"M2Mini.jpg";
101     groupPurchase.title = @"增加用例";
102     groupPurchase.price = @"88";
103     groupPurchase.buyCount = @"32";
104
105     // 加入新数据
106     NSMutableArray *marray = [NSMutableArray arrayWithArray:self.groupPurchases];
107     [marray addObject:groupPurchase];
108     self.groupPurchases = marray;
109
110     // 刷新数据
111     [self.tableView reloadData];
112 }
113
114 // 配置一些头部广告的数据
115 - (HeaderAdView *) genAdView {
116     HeaderAdView *adView = [HeaderAdView headerAdView];
117
118     NSMutableArray *adImages = [NSMutableArray array];
119     for (int i=0; i<5; i++) {
120         [adImages addObject:[NSString stringWithFormat:@"ad_%02d", i]];
121     }
122
123     adView.ads = adImages;
124
125     return adView;
126 }
127
128 @end

2.自定义cell

 1 //
 2 //  GroupPurchaseCell.m
 3 //  GroupPurchase
 4 //
 5 //  Created by hellovoidworld on 14/12/3.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "GroupPurchaseCell.h"
10 #import "GroupPurchase.h"
11
12 @implementation GroupPurchaseCell
13
14 // 界面被初始化的时候调用 awakeFromNib
15 - (void)awakeFromNib {
16     // Initialization code
17 }
18
19 - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
20     [super setSelected:selected animated:animated];
21
22     // Configure the view for the selected state
23 }
24
25 /** 自定初始化的类方法,传入model数据 */
26 + (instancetype) groupPurchaseCellWithTableView:(UITableView *) tableView {
27
28     static NSString *ID = @"groupPurchase";
29
30     // 从缓存池寻找
31     GroupPurchaseCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
32
33     // 若缓存池没有,则创建一个
34     if (nil == cell) {
35         cell = [[[NSBundle mainBundle] loadNibNamed:@"GroupPurchaseCell" owner:nil options:nil] lastObject];
36     }
37
38     return cell;
39 }
40
41 /** 加载Model数据,初始化界面 */
42 - (void) setGroupPurchase:(GroupPurchase *) groupPurchase {
43     if (nil != groupPurchase) {
44         self.titleLabel.text = groupPurchase.title;
45         self.iconImageView.image = [UIImage imageNamed:groupPurchase.icon];
46         self.priceLabel.text = [NSString stringWithFormat:@"¥%@", groupPurchase.price];
47         self.buyCountLabel.text = [NSString stringWithFormat:@"%@人已经购买", groupPurchase.buyCount];
48     }
49
50     _groupPurchase = groupPurchase;
51 }
52
53 @end
54  

3.底部加载按钮

 1 //
 2 //  FooterRefreshView.h
 3 //  GroupPurchase
 4 //
 5 //  Created by hellovoidworld on 14/12/3.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10
11 @class FooterRefreshView;
12
13 // 定义delegate协议
14 @protocol FooterRefreshViewDelegate <NSObject>
15
16 @optional
17 - (void) footerRefreshViewClickedFooterRefreshButton:(FooterRefreshView *) footerRefreshView;
18
19 @end
20
21 @interface FooterRefreshView : UIView
22
23 // 带代理的初始化方法
24 + (instancetype) footerRrefreshViewWithDelegate:(id<FooterRefreshViewDelegate>) delegate;
25
26 @end

 1 //
 2 //  FooterRefreshView.m
 3 //  GroupPurchase
 4 //
 5 //  Created by hellovoidworld on 14/12/3.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "FooterRefreshView.h"
10
11 @interface FooterRefreshView()
12 /** 底部的“加载更多”按钮 */
13 @property (weak, nonatomic) IBOutlet UIButton *footerRefreshButton;
14
15 /** 加载动画图标 */
16 @property (weak, nonatomic) IBOutlet UIActivityIndicatorView *loadingImage;
17
18 /** 代理 */
19 @property(nonatomic, weak) id<FooterRefreshViewDelegate> delegate;
20
21 /** “加载更多”按钮点击事件 */
22 - (IBAction)onFooterRefreshButtonClicked;
23
24
25 @end
26
27 @implementation FooterRefreshView
28
29 #pragma mark - 初始化
30
31 /** 初始化方法 */
32 + (instancetype) footerRrefreshViewWithDelegate:(id<FooterRefreshViewDelegate>) delegate {
33     FooterRefreshView *footerRefreshView = [[[NSBundle mainBundle] loadNibNamed:@"FooterRefreshView" owner:nil options:nil] lastObject];
34
35     if (nil != delegate) {
36         footerRefreshView.delegate = delegate;
37     }
38
39     return footerRefreshView;
40 }
41
42 // xib控件的初始化调用方法
43 - (void)awakeFromNib {
44     self.loadingImage.hidden = YES;
45 }
46
47
48 #pragma mark - action
49 /** “加载更多”按钮点击事件 */
50 - (IBAction)onFooterRefreshButtonClicked {
51     NSString *footerButtonTitle = self.footerRefreshButton.currentTitle;
52
53     // 显示正在加载
54     self.loadingImage.hidden = NO;
55     [self.footerRefreshButton setTitle:@"拼命加载中..." forState:UIControlStateNormal];
56
57     // 暂时禁止按钮事件
58     self.footerRefreshButton.userInteractionEnabled = NO;
59
60     // 模拟延迟
61     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
62         // 通知代理发生了点击事件
63         if ([self.delegate respondsToSelector:@selector(footerRefreshViewClickedFooterRefreshButton:)]) {
64             [self.delegate footerRefreshViewClickedFooterRefreshButton:self];
65         }
66
67         // 恢复按钮状态
68         self.footerRefreshButton.userInteractionEnabled = YES;
69         self.loadingImage.hidden = YES;
70         [self.footerRefreshButton setTitle:footerButtonTitle forState:UIControlStateNormal];
71     });
72
73 }
74
75 @end

4.头部广告

 1 //
 2 //  HeaderAdView.h
 3 //  GroupPurchase
 4 //
 5 //  Created by hellovoidworld on 14/12/3.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <UIKit/UIKit.h>
10
11 @interface HeaderAdView : UIView
12 // 广告组
13 @property(nonatomic, strong) NSArray *ads;
14
15 + (instancetype) headerAdView;
16
17 @end

  1 //
  2 //  HeaderAdView.m
  3 //  GroupPurchase
  4 //
  5 //  Created by hellovoidworld on 14/12/3.
  6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
  7 //
  8
  9 #import "HeaderAdView.h"
 10
 11 #define AD_VIEW_WIDTH 300
 12 #define AD_VIEW_HEIGHT 120
 13
 14 // 遵守UIScrollViewDelegate监控滚动事件
 15 @interface HeaderAdView() <UIScrollViewDelegate>
 16
 17 /** scrollView控件 */
 18 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
 19
 20 /** 页码 */
 21 @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
 22
 23 /** 计时器 */
 24 @property(nonatomic, weak) NSTimer *timer;
 25
 26 @end
 27
 28 @implementation HeaderAdView
 29
 30 #pragma mark - 初始化方法
 31 // 初始化headerAdView
 32 + (instancetype) headerAdView {
 33     return [[[NSBundle mainBundle] loadNibNamed:@"HeaderAdView" owner:nil options:nil] lastObject];
 34 }
 35
 36 // 当控件从nib初始化
 37 - (void)awakeFromNib {
 38     self.scrollView.scrollEnabled = YES; // 开启滚动
 39     self.scrollView.pagingEnabled = YES; // 开启翻页模式
 40     self.scrollView.delegate = self;// 设置代理
 41 }
 42
 43 /** 设置ads */
 44 - (void) setAds:(NSArray *)ads {
 45     if (nil != ads) {
 46         CGFloat adImageWidth = AD_VIEW_WIDTH;
 47         CGFloat adImageHeight = AD_VIEW_HEIGHT;
 48         CGFloat adImageY = 0;
 49
 50         for (int i=0; i<ads.count; i++) {
 51             // 计算当前图片的水平坐标
 52             CGFloat adImageX = i * adImageWidth;
 53
 54             UIImageView *adImageView = [[UIImageView alloc] initWithFrame:CGRectMake(adImageX, adImageY, adImageWidth, adImageHeight)];
 55             adImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@", ads[i]]];
 56
 57             [self.scrollView addSubview:adImageView];
 58         }
 59
 60         // 设置滚动范围
 61         self.scrollView.contentSize = CGSizeMake(ads.count * AD_VIEW_WIDTH, 0);
 62
 63         self.pageControl.numberOfPages = ads.count; // 总页数
 64         self.pageControl.pageIndicatorTintColor = [UIColor blackColor]; // 其他页码颜色
 65         self.pageControl.currentPageIndicatorTintColor = [UIColor redColor]; // 当前页码颜色
 66
 67         // 添加自动轮播
 68         [self addTimer];
 69     }
 70
 71     _ads = ads;
 72 }
 73
 74 #pragma mark - 滚动事件
 75 // 滚动动作监控,当滚动超过图片的一半的时候转变页码
 76 - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
 77     CGFloat scrollViewWidth = self.scrollView.frame.size.width;
 78     int page = (self.scrollView.contentOffset.x + 0.5 * scrollViewWidth) / scrollViewWidth;
 79     self.pageControl.currentPage = page;
 80 }
 81
 82 // 手动拖动广告图片轮播的时候,暂时销毁自动轮播器
 83 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
 84     [self.timer invalidate];
 85     self.timer = nil;
 86 }
 87
 88 // 手动拖动结束,从新加上自动轮播器
 89 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {
 90     [self addTimer];
 91 }
 92
 93 // 添加计时器
 94 - (void) addTimer {
 95     self.timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
 96
 97     // 计时器分享主线程资源
 98     [[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
 99 }
100
101 // 下一张图片动作
102 - (void) nextImage {
103     int page = 0;
104     // 如果是当前页码在最后一页,从新回到第一页
105     if (self.pageControl.currentPage == self.ads.count - 1) {
106         page = 0;
107     }
108     else {
109         page = self.pageControl.currentPage + 1;
110     }
111
112     // 滚动图片,带动画效果
113     [self.scrollView setContentOffset:CGPointMake(page * AD_VIEW_WIDTH, 0) animated:YES];
114 }
115 @end

5.model

 1 //
 2 //  GroupPurchase.h
 3 //  GroupPurchase
 4 //
 5 //  Created by hellovoidworld on 14/12/3.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10
11 @interface GroupPurchase : NSObject
12
13 /** 图片 */
14 @property(nonatomic, copy) NSString *icon;
15
16 /** 标题 */
17 @property(nonatomic, copy) NSString *title;
18
19 /** 已经购买人数 */
20 @property(nonatomic, copy) NSString *buyCount;
21
22 /** 价格 */
23 @property(nonatomic, copy) NSString *price;
24
25 //初始化方法
26 - (instancetype) initWithDictionary:(NSDictionary *) dictionary;
27 + (instancetype) groupPurchaseWithDictionary:(NSDictionary *) dictionary;
28 + (instancetype) groupPurchase;
29
30 @end

 1 //
 2 //  GroupPurchase.m
 3 //  GroupPurchase
 4 //
 5 //  Created by hellovoidworld on 14/12/3.
 6 //  Copyright (c) 2014年 hellovoidworld. All rights reserved.
 7 //
 8
 9 #import "GroupPurchase.h"
10
11 @implementation GroupPurchase
12
13 //初始化方法
14 - (instancetype) initWithDictionary:(NSDictionary *) dictionary
15 {
16     if (self = [super init]) {
17         // 使用KVC
18         [self setValuesForKeysWithDictionary:dictionary];
19     }
20
21     return self;
22 }
23
24 + (instancetype) groupPurchaseWithDictionary:(NSDictionary *) dictionary {
25     return [[self alloc] initWithDictionary:dictionary];
26 }
27
28 + (instancetype) groupPurchase {
29     return [self groupPurchaseWithDictionary:nil];
30 }
31
32 @end

6.plist文件结构

时间: 2024-10-11 02:08:05

ios基础控件 之展示团购数据 UITableViewCell <代理,xib封装view>的相关文章

iOS基础控件-UINavigationController 中的传值,代理传值,正向传值,反向传值

/* 程序过程: 1,创建一个根视图,一个二级视图 2,根视图 NavigationItem.title = Root  二级视图NavigationItem.title = Second 根视图NavigationItem.rightButton 入栈二级视图 3, 二级视图中创建三个按钮 按钮一  按钮二  按钮三 三个按钮点击时间都是出栈,并把自己的按钮的 titel 赋给 根视图的NavigationItem.title 4,当再次进入二级视图时,判断 根视图的NavigationIte

iOS基础控件UINavigationController中的传值

iOS基础控件UINavigationController中的传值,代理传值,正向传值,反向传值 #import <UIKit/UIKit.h> //声明一个协议 @protocol SendValue<NSObject> //定义一个方法 - (void)sendBtnTitle:(NSString *)title; @end @interface FirstViewController : UIViewController // 定义代理 @property (nonatomi

[iOS基础控件 - 5.5] 代理设计模式 (基于”APP列表&quot;练习)

A.概述 在"[iOS基础控件 - 4.4] APP列表 进一步封装,初见MVC模式”上进一步改进,给“下载”按钮加上效果.功能 1.按钮点击后,显示为“已下载”,并且不可以再按 2.在屏幕中间弹出一个消息框,通知消息“xx已经被安装”,慢慢消失 3.消息框样式为圆角半透明 B.不使用代理模式,使用app空间组和主View之间的父子View关系 1.在主View中创建一个消息框 主View控制器:ViewController.m 1 // 创建下载成功消息框 2 CGFloat labelWid

[iOS基础控件 - 6.6.1] 展示团购数据代码[iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)

A.需求 1.类似于微博内容的展示 2.头像 3.名字 4.会员标志 5.内容 6.分割线 7.配图(可选,可有可无) B.思路.步骤 1.Controller:UITableViewController 改变控制器继承自UITableViewController,storyboard中也同时使用新的TableViewController,其TableView作为启动入口. 2.View:代码自定义cell 使用代码组装每个cell,动态改变控件的位置.尺寸 cell含有一个WeiboFrame

[iOS基础控件 - 6.7.1] 微博展示 代码

Controller: 1 // 2 // ViewController.m 3 // Weibo 4 // 5 // Created by hellovoidworld on 14/12/4. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "Weibo.h" 11 #import "W

ios基础控件之开关按钮(UISwitch)

UISwitch控件是iOS开发的基础控件,是非常简单的一个控件,因为它的方法比较少.UISwitch继承于UIControl基类,因此可以当成活动控件使用. 注意:开关状态通过它的on属性进行读取,该属性是一个BOOL属性 创建: UISwitch* mySwitch = [[ UISwitch alloc]initWithFrame:CGRectMake(0.150.0f,100.0f,0.0f,0.0f)]; 可能你会疑问为什么它的大小都设置为0?没错,它的大小你设置是无效的,系统会为你分

[iOS基础控件 - 6.6.1] 展示团购数据代码

1.主控制器: 1 // 2 // ViewController.m 3 // GroupPurchase 4 // 5 // Created by hellovoidworld on 14/12/3. 6 // Copyright (c) 2014年 hellovoidworld. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "GroupPurchase.h" 11 #im

[iOS基础控件 - 6.6] 展示团购数据 自定义TableViewCell

A.需求 1.头部广告 2.自定义cell:含有图片.名称.购买数量.价格 3.使用xib设计自定义cell,自定义cell继承自UITableViewCell 4.尾部“加载更多按钮”,以及其被点击之后的数据加载刷新.动画效果 B.实现 1.使用MVC M:团购Model V:总View.cell的View(包含类和界面) C:ViewController 2.分类管理代码文件 3.尾部footerView “加载更多"功能 1 // 设置尾部控件 2 self.tableView.table

iOS 基础控件(下)

上篇介绍了UIButton.UILabel.UIImageView和UITextField,这篇就简短一点介绍UIScrollView和UIAlertView. UIScrollView 顾名思义也知道这个是和滚动相关的控件,在Android开发时遇到过ScrollView,当内容的尺寸超出了屏幕范围之后,用ScrollView则可以通过滚动的方式使得超出屏幕的那部分内容通过滚动的方式显示出来,在Android里面有水平的ScrollView和垂直的ScrollView,在iOS里面就只有一个S