首页 > 移动平台 > 详细

iOS UI-团购案例(通过xib文件自定义UITableViewCell)

时间:2016-01-07 21:26:21      阅读:329      评论:0      收藏:0      [点我收藏+]

一、Model

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface Goods : NSObject
 4 
 5 @property (nonatomic, copy) NSString *icon;
 6 @property (nonatomic, copy) NSString *title;
 7 @property (nonatomic, copy) NSString *price;
 8 @property (nonatomic, copy) NSString *buyCount;
 9 
10 - (instancetype) initWithDict:(NSDictionary *)dict;
11 + (instancetype) goodsWithDict:(NSDictionary *)dict;
12 
13 
14 @end
15 
16 #import "Goods.h"
17 
18 @implementation Goods
19 
20 - (instancetype)initWithDict:(NSDictionary *)dict
21 {
22     if (self = [super init]) {
23         [self setValuesForKeysWithDictionary:dict];
24     }
25     return self;
26 }
27 
28 + (instancetype)goodsWithDict:(NSDictionary *)dict
29 {
30     return [[self alloc] initWithDict:dict];
31 }
32 
33 @end

二、View

技术分享

 1 #import <UIKit/UIKit.h>
 2 
 3 @interface BWHeaderView : UIView
 4 
 5 + (instancetype)headerView;
 6 
 7 @end
 8 
 9 #import "BWHeaderView.h"
10 
11 @interface BWHeaderView ()
12 @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
13 
14 @end
15 
16 @implementation BWHeaderView
17 
18 //当这个方法被执行的时候就表示BWHeaderView已经从xib文件中创建好了
19 //BWHeaderView的子控件也都创建好了,所以就可以使用UIScrollView了。
20 - (void)awakeFromNib
21 {
22     
23 }
24 
25 //创建headerView
26 + (instancetype)headerView
27 {
28     BWHeaderView *headerView = [[[NSBundle mainBundle] loadNibNamed:@"BWHeaderView" owner:nil options:nil] lastObject];
29     return headerView;
30 }
31 
32 @end

 

 

技术分享

 1 #import <UIKit/UIKit.h>
 2 
 3 // 协议命名规范:
 4 // 类名 + Delegate
 5 // 协议中的方法最好加@optional
 6 // 定义一个delegate属性,delegate属性用weak
 7 // delegate属性声明为id类型,可以用来解除对头文件的依赖
 8 
 9 @class BWFooterView;
10 @protocol  BWFooterViewDelegate <NSObject>
11 
12 @required
13 - (void)footerViewUpDateData:(BWFooterView *)footerView;
14 @end
15 
16 @interface BWFooterView : UIView
17 
18 @property(weak, nonatomic) id<BWFooterViewDelegate> delegate;
19 
20 + (instancetype)footerView;
21 
22 @end
23 
24 #import "BWFooterView.h"
25 
26 @interface BWFooterView ()
27 @property (weak, nonatomic) IBOutlet UIButton *btnLoadMore;
28 @property (weak, nonatomic) IBOutlet UIView *waittingView;
29 - (IBAction)btnLoadMoreClick:(id)sender;
30 
31 @end
32 
33 @implementation BWFooterView
34 
35 //通过xib设置tableView中的tableFooterView
36 + (instancetype)footerView
37 {
38     BWFooterView *footerView = [[[NSBundle mainBundle] loadNibNamed:@"BWFooterView" owner:nil options:nil] lastObject];
39     return footerView;
40 }
41 
42 //加载按钮单击事件
43 - (IBAction)btnLoadMoreClick:(id)sender {
44     
45     //1.隐藏“加载更多”按钮
46     self.btnLoadMore.hidden = YES;
47     //2.显示“等待指示器”所在的那个View
48     self.waittingView.hidden = NO;
49     
50     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
51         //调用代理方法
52         if ([self.delegate respondsToSelector:@selector(footerViewUpDateData:)]) {
53             //3.增加一条数据
54             //3.1创建一个模型对象
55             //3.2把模型对象加载控制器的goods集合中
56             //4.刷新UITableView
57             [self.delegate footerViewUpDateData:self];
58         }
59         //5.显示“加载更多”按钮
60         self.btnLoadMore.hidden = NO;
61         //6.隐藏“等待指示器”所在的那个View
62         self.waittingView.hidden = YES;
63     });
64     
65 }
66 @end

 

技术分享

 1 #import <UIKit/UIKit.h>
 2 @class Goods;
 3 
 4 @interface BWGoodsCell : UITableViewCell
 5 
 6 @property (weak, nonatomic) IBOutlet UIImageView *imgView;
 7 @property (weak, nonatomic) IBOutlet UILabel *lblName;
 8 @property (weak, nonatomic) IBOutlet UILabel *lblPrice;
 9 @property (weak, nonatomic) IBOutlet UILabel *lblBuyCount;
10 
11 @property (strong, nonatomic) Goods *myGoods;
12 
13 + (instancetype)goodsCellWithTableView:(UITableView *)tableView;
14 @end
15 
16 
17 #import "BWGoodsCell.h"
18 #import "Goods.h"
19 
20 @interface BWGoodsCell ()
21 
22 @end
23 
24 @implementation BWGoodsCell
25 
26 // 重写setMyGoods方法,把模型的数据设置给子控件
27 - (void)setMyGoods:(Goods *)myGoods
28 {
29     _myGoods = myGoods;
30     
31     self.imgView.image = [UIImage imageNamed:_myGoods.icon];
32     self.lblName.text = _myGoods.title;
33     self.lblPrice.text = [NSString stringWithFormat:@"$ %@",_myGoods.price];
34     self.lblBuyCount.text = [NSString stringWithFormat:@"%@个人已购买",_myGoods.buyCount];
35 }
36 
37 // 创建单元格
38 + (instancetype)goodsCellWithTableView:(UITableView *)tableView
39 {
40     static NSString *cellIndentifier = @"cellIndentifier";
41     BWGoodsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIndentifier];
42     
43     if (!cell) {
44         cell = [[[NSBundle mainBundle] loadNibNamed:@"BWGoodsCell" owner:nil options:nil] firstObject];
45     }
46     return cell;
47 }
48 - (void)awakeFromNib {
49     // Initialization code
50 }
51 
52 - (void)setSelected:(BOOL)selected animated:(BOOL)animated {
53     [super setSelected:selected animated:animated];
54 
55     // Configure the view for the selected state
56 }
57 
58 @end

 

三、Controller

  1 #import "ViewController.h"
  2 #import "Goods.h"
  3 #import "BWGoodsCell.h"
  4 #import "BWFooterView.h"
  5 #import "BWHeaderView.h"
  6 
  7 @interface ViewController ()<UITableViewDataSource,BWFooterViewDelegate>
  8 
  9 @property (nonatomic, strong) NSMutableArray *arrayModel;
 10 @property (nonatomic, strong) UITableView *tableView;
 11 
 12 @end
 13 
 14 @implementation ViewController
 15 
 16 #pragma mark - 懒加载
 17 - (NSArray *)arrayModel
 18 {
 19     if (_arrayModel == nil) {
 20         NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil];
 21         
 22         NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];
 23         
 24         NSMutableArray *arrayModel = [NSMutableArray array];
 25         
 26         for (NSDictionary *dict in arrayDict) {
 27             Goods *goodsModel = [Goods goodsWithDict:dict];
 28             [arrayModel addObject:goodsModel];
 29         }
 30         _arrayModel = arrayModel;
 31     }
 32     
 33     return _arrayModel;
 34 }
 35 
 36 #pragma mark - 加载视图
 37 - (void)viewDidLoad {
 38     [super viewDidLoad];
 39     self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStyleGrouped];
 40     self.tableView.dataSource =self;
 41     
 42     [self.view addSubview:self.tableView];
 43     self.tableView.rowHeight = 100;
 44 
 45     //ps:tableView 的tableFooterView特点:只能修改x和height值,y和height不能修改
 46     
 47     //创建tableFooterView
 48     BWFooterView *footerView = [BWFooterView footerView];
 49     //设置footerView的代理
 50     footerView.delegate =self;
 51     self.tableView.tableFooterView = footerView;
 52     
 53     //创建tableHeaderView
 54     BWHeaderView *headerView = [BWHeaderView headerView];
 55     
 56     self.tableView.tableHeaderView = headerView;
 57     
 58     
 59 }
 60 #pragma mark - CZFooterView的代理方法
 61 - (void)footerViewUpDateData:(BWFooterView *)footerView
 62 {
 63     //3.增加一条数据
 64     //3.1创建一个模型对象
 65     Goods *model = [[Goods alloc] init];
 66     model.title = @"驴肉火烧";
 67     model.price = @"6.0";
 68     model.buyCount = @"1000";
 69     model.icon = @"7003217f16ed29bab85e635a3bd6b60d";
 70     //3.2把模型对象加载控制器的goods集合中
 71     [self.arrayModel addObject:model];
 72     //4.刷新UITableView
 73     [self.tableView reloadData];
 74     
 75     //ps:局部刷新(仅适用于UITableView的总行数没有发生变化的时候)
 76 //    NSIndexPath *indexpath =  [NSIndexPath indexPathForRow:self.arrayModel.count-1 inSection:0];
 77 //    [self.tableView reloadRowsAtIndexPaths:@[indexpath] withRowAnimation:UITableViewRowAnimationLeft];
 78     
 79     //5.把UITableView中最后一行滚动到最上面
 80     NSIndexPath *indexpath =  [NSIndexPath indexPathForRow:self.arrayModel.count-1 inSection:0];
 81     [self.tableView scrollToRowAtIndexPath:indexpath atScrollPosition:UITableViewScrollPositionTop animated:YES];
 82 }
 83 
 84 #pragma mark - 数据源
 85 //加载组的行数
 86 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 87 {
 88     return self.arrayModel.count;
 89 }
 90 //加载单元格数据
 91 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 92 {
 93     //1.获取数据模型
 94     Goods *goodsModel = self.arrayModel[indexPath.row];
 95     
 96     //2.创建单元格
 97     BWGoodsCell *cell = [BWGoodsCell goodsCellWithTableView:tableView];
 98 
 99 //   在控制器中直接为cell的每个子控件赋值数据造成问题
100 // 1>控制器强依赖于cell,一旦cell内部的子控件发生变化,那么子控件中的代码也得改(紧耦合)
101 // 2>cell封装不够完整,凡是用到cell的地方
102 // 3>解决:直接把模型传递给自定义cell,然后在自定义cell内部解析model中的数据赋值给自定义cell的内部的子控件
103 
104     //3.把模型数据设置给单元格
105     cell.myGoods = goodsModel;
106     
107     //4.返回单元格
108     return cell;
109 }
110 
111 #pragma mark - 状态栏
112 - (BOOL)prefersStatusBarHidden
113 {
114     return YES;
115 }
116 
117 #pragma mark - 内存
118 - (void)didReceiveMemoryWarning {
119     [super didReceiveMemoryWarning];
120     // Dispose of any resources that can be recreated.
121 }
122 
123 @end

 

iOS UI-团购案例(通过xib文件自定义UITableViewCell)

原文:http://www.cnblogs.com/oc-bowen/p/5111213.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!