上一篇博客说了UIScrollView(滚动视图),以及如何实现无限滚动的原理,那么这一次结合UIScrollView,以及UITableView(表格视图)做一个模拟团购的小Demon,并使用了xib以及加载pilsit文件,因为这个demon楼主做了比较久了,属于学iOS的初级demon,所以没有使用任何的约束,也没有任何的MVC思想,因为要想达到比较好的效果,用iPhone4或者IPhone4s的3.5英寸的屏幕观看,效果如下
总体是一个数组,每一个数组元素是一个字典,那么字典其实就可以看做一个model,so,model类就非常简单了,Food类如下
#import <UIKit/UIKit.h> @interface Food : NSObject @property(nonatomic,strong) NSString * icon;//图片路径 @property(nonatomic,strong) NSString * name;//图片名 @property(nonatomic,strong) NSString * price;//价格 @property(nonatomic,strong) NSString * buyCount;//购买人数 -(instancetype)initWithDict:(NSDictionary *)dic; //便利构造器 +(instancetype)foodWithDict:(NSDictionary *)dic; @end
实现文件也就这两个方法
- (instancetype)initWithDict:(NSDictionary *)dic { self = [super init]; if (self) { //通过KVC简易赋值 [self setValuesForKeysWithDictionary:dic]; } return self; } + (instancetype)foodWithDict:(NSDictionary *)dic { __autoreleasing Food * food = [[Food alloc]initWithDict:dic]; return food; }
// // HeadLoad.h // 团购网站 // // Created by YueWen on 15/9/1. // Copyright (c) 2015年 YueWen. All rights reserved. // #import <UIKit/UIKit.h> @interface HeadLoad : UIView @property(nonatomic,assign,readonly) NSInteger numberOfImage;//scrollView中图片的数量 -(instancetype)loadHeadView:(NSArray *)arrayImage;//加载ScrollView的图片 @end
@interface HeadLoad ()<UIScrollViewDelegate> @property (strong, nonatomic) IBOutlet UIScrollView *scrollView; @property (strong, nonatomic) IBOutlet UIPageControl *pageControl; @property (strong,nonatomic) NSTimer * timer; @end
//提高timer的优先级 NSRunLoop * runLoop = [NSRunLoop currentRunLoop];//获得当前的运行池,现在看来和用子线程是一样的,只不过这个是将timer添加到了主线程中 [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
@protocol FootLoadDelegate <NSObject> @required//必须有 -(void)loadData:(FootLoad *)foodLoad;//加载数据 @end
@property(nonatomic,weak)id<FootLoadDelegate> delegate;
@interface FootLoad () @property (strong, nonatomic) IBOutlet UIButton *footLoadLoadMore;//加载更多的按钮 @property (strong, nonatomic) IBOutlet UIView *footLoadLabelView;//最下层贴着label以及烽火轮的view @end
//为按钮点击进行监听 - (IBAction)clickLoadMoreButton { self.footLoadLabelView.hidden = NO;//努力加载以及风火轮出现 self.footLoadLoadMore.hidden = YES;//加载更多的按钮隐藏 //通过GCD延迟1.5秒后运行 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^ { //执行代理的loadData方法 [self.delegate loadData:self]; //时间到 self.footLoadLoadMore.hidden = NO;//加载更多的按钮出现 self.footLoadLabelView.hidden = YES;//努力加载以及风火轮被覆盖 }); }
-(void)loadData:(FootLoad *)foodLoad { //如果代理遵守了协议,即重写了loadData方法 if (![self.delegate respondsToSelector:@selector(loadData:)]) { //执行代理的方法 [self.delegate loadData:self]; } }
自定义的cell也是用xib做的,和storyboard一样用,拖入一个UITableViewCell,在上面布局即可
-(void)setFood:(Food *)food;
@interface MyCell () @property (strong, nonatomic) IBOutlet UIImageView *myCellImageView;//显示图片的imageView @property (strong, nonatomic) IBOutlet UILabel *myCellFoodName;//显示食物的名字 @property (strong, nonatomic) IBOutlet UILabel *myCellFoodPrice;//显示食物的价格 @property (strong, nonatomic) IBOutlet UILabel *myCellFoodBuyCount;//显示食物的购买人数 @end
-(void)setFood:(Food *)food { self.myCellImageView.image = [UIImage imageNamed:[food icon]]; self.myCellFoodName.text = [food name]; self.myCellFoodPrice.text = [NSString stringWithFormat:@"¥ %@",[food price]]; self.myCellFoodBuyCount.text = [NSString stringWithFormat:@"%@ 人已经购买",[food buyCount]]; }
接着就是在自定义的类MyCell中拖入输出口,但是不希望外界修改,那么只给外界提供一个方法接口,传入一个Food类,直接打包好一个cell即可
#import "ViewController.h" #import "Food.h" #import "MyCell.h" #import "FootLoad.h" #import "HeadLoad.h" @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,FootLoadDelegate> @property(nonatomic,strong)UITableView * tableView;//显示食物的表格视图 @property(nonatomic,strong)NSMutableArray * foods;//存储所有的食物对象,因为可以添加,所以是可变数组 @end
#pragma mark - 懒加载 -(NSMutableArray *)foods { NSMutableArray * array = [NSMutableArray array]; //如果数据数组为nil的时候 if (!_foods) { //获得plist的文件路径 NSString * path = [[NSBundle mainBundle] pathForResource:@"foods" ofType:@"plist"]; //创建储存所有plist数据的数组 NSArray * allData = [NSArray arrayWithContentsOfFile:path]; //开始遍历数组,并添加数据 for (NSDictionary * dic in allData) { //创建模型 Food * food = [Food foodWithDict:dic]; [array addObject:food]; } //为数据赋值 _foods = array; } return _foods; }
- (void)viewDidLoad { [super viewDidLoad]; self.tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];//设置tableView的格式为不分组 self.tableView.rowHeight = 90;//每个cell的高度为90 self.tableView.showsVerticalScrollIndicator = NO;//设置垂直指示器不显示 [self.view addSubview:self.tableView]; //设置数据源和代理对象 self.tableView.delegate = self; self.tableView.dataSource = self; //加载最下侧的 加载更多 view FootLoad * footView = [[[NSBundle mainBundle] loadNibNamed:@"FootLoad" owner:nil options:nil] firstObject];//加载xib中的组件用该方法,xib中可能右多个组件,所以会返回一个数组,自己做的xib里面只有一个组件,所以取第一个对象或者最后一个都可以 //设置代理 footView.delegate = self; self.tableView.tableFooterView = footView;//将tableView的footView设置成 //加载最上侧的 scrollView HeadLoad * headView = [[[NSBundle mainBundle] loadNibNamed:@"HeadLoad" owner:nil options:nil] firstObject]; [headView loadHeadView:self.foods]; self.tableView.tableHeaderView = headView; }
#pragma mark - 实现UITableViewDataSource 方法 //返回一共多少行 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { //foods有多少个food对象既为多少行 return self.foods.count; } //返回cell - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //创建 cell 的id static NSString * cellId = @"cellId"; //根据id从缓冲池中查找Cell MyCell * cell = [tableView dequeueReusableCellWithIdentifier:cellId]; //如果没有查找到 if (!cell) { //从xib中加载cell cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCell" owner:nil options:nil] firstObject]; } //赋值 [cell setFood:self.foods[indexPath.row]]; return cell; }
#pragma mark - 履行 FootLoadDelegate 的协议方法 -(void)loadData:(FootLoad *)foodLoad { //随机的一个数字 int random = arc4random()%(self.foods.count); //根据随机数字 取出模型food Food * food = self.foods[random]; //将 模型对象 添加到控制器的foods [self.foods addObject:food]; //刷新tableView [self.tableView reloadData]; //滚动数据 NSIndexPath * indexPath = [NSIndexPath indexPathForRow:self.foods.count - 1 inSection:0]; [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];//最下边的滚到最上面 }
#pragma mark - 隐藏信息栏 -(BOOL)prefersStatusBarHidden { return YES; }