• UI基础之UITableView案例团购----自定义cell利用xib


    一:模型数据:

    #import <Foundation/Foundation.h>
    
    @interface LLGroup : NSObject
    
    /**
     *  icon
     */
    @property (nonatomic, copy) NSString *icon;
    
    /**
     *  title
     */
    @property (nonatomic, copy) NSString *title;
    
    /**
     *  buyCount
     */
    @property (nonatomic, copy) NSString *buyCount;
    
    /**
     *  price
     */
    @property (nonatomic, copy) NSString *price;
    
    + (instancetype)groupWithDic:(NSDictionary *)dic;
    - (instancetype)initWithDic:(NSDictionary *)dic;
    
    + (NSMutableArray *)groupList;
    
    @end
    #import "LLGroup.h"
    
    @implementation LLGroup
    
    + (instancetype)groupWithDic:(NSDictionary *)dic
    {
        return [[self alloc] initWithDic:dic];
    }
    - (instancetype)initWithDic:(NSDictionary *)dic
    {
        if (self = [super init]) {
            
            [self setValuesForKeysWithDictionary:dic];
        }
        return self;
    }
    
    + (NSMutableArray *)groupList
    {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"tgs.plist" ofType:nil];
        NSArray *dicArray = [NSArray arrayWithContentsOfFile:path];
        
        NSMutableArray *tmpArray = [[NSMutableArray alloc] initWithCapacity:dicArray.count];
        for (NSDictionary *dic in dicArray) {
            
            LLGroup *group = [LLGroup groupWithDic:dic];
            [tmpArray addObject:group];
        }
        return tmpArray;
    }
    
    @end

    二:自定义cell:利用xib自定义cell (

    #import <UIKit/UIKit.h>
    @class LLGroup;
    @interface LLGroupCell : UITableViewCell
    
    /**
     *  数据模型
     */
    @property (nonatomic, strong) LLGroup *group;
    
    + (instancetype)groupCellWith:(UITableView *)tableView;
    
    @end
    #import "LLGroupCell.h"
    #import "LLGroup.h"
    @interface LLGroupCell ()
    
    @property (weak, nonatomic) IBOutlet UIImageView *iconView;
    @property (weak, nonatomic) IBOutlet UILabel *nameView;
    
    @property (weak, nonatomic) IBOutlet UILabel *priceView;
    @property (weak, nonatomic) IBOutlet UILabel *buyCountView;
    
    @end
    
    @implementation LLGroupCell
    
    - (void)awakeFromNib {
        // Initialization code
    }
    
    + (instancetype)groupCellWith:(UITableView *)tableView
    {
        static NSString *ID = @"groupCell";
        LLGroupCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
        if (!cell) {
            
            cell = [[[NSBundle mainBundle] loadNibNamed:@"LLGroupCell" owner:nil options:nil] lastObject];
        }
        
        // 设置cell选中颜色
        UIImageView *selectedImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"buttonorange"]];
        UIImageView *backgroundImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"buttonorange"]];
        cell.backgroundView = backgroundImageView;
        cell.selectedBackgroundView = selectedImageView;
        
        return cell;
    }
    
    - (void)setGroup:(LLGroup *)group
    {
        _group = group;
        
        self.iconView.image = [UIImage imageNamed:group.icon];
        self.nameView.text = group.title;
        self.buyCountView.text = [NSString stringWithFormat:@"已购买%@人", group.buyCount];
        self.priceView.text = [NSString stringWithFormat:@"¥%@", group.price];
        
    }
    
    @end

    设置cell子控件数据:自定义cell应该拥有模型数据,在setter方法中赋值是最合适的

    三:自定义footer(利用xib)

    #import <UIKit/UIKit.h>
    
    @class LLFooterView;
    @protocol LLFooterViewDelegate <NSObject>
    
    @optional
    - (void)footerViewDidClickLoadBtn:(LLFooterView *)footerView;
    
    @end
    
    @interface LLFooterView : UIView
    
    @property (nonatomic, weak) id<LLFooterViewDelegate> delegate;
    
    + (instancetype)footerView;
    
    @end
    #import "LLFooterView.h"
    
    @interface LLFooterView ()
    
    @property (weak, nonatomic) IBOutlet UIButton *loadBtn;
    @property (weak, nonatomic) IBOutlet UIView *loadingView;
    - (IBAction)clickBtn:(UIButton *)sender;
    
    
    @end
    
    @implementation LLFooterView
    
    + (instancetype)footerView
    {
        LLFooterView *footerView = [[[NSBundle mainBundle] loadNibNamed:@"LLFooterView" owner:nil options:nil] lastObject];
        return footerView;
    }
    
    // 当xib加载完毕后系统自动调用
    - (void)awakeFromNib
    {
        self.loadBtn.backgroundColor = [UIColor colorWithRed:241/255.0 green:170/255.0 blue:102/255.0 alpha:1.0];
        
        // 设置按钮圆角
        self.loadBtn.layer.cornerRadius = 10.0;
        self.loadBtn.layer.masksToBounds = YES;
    }
    
    - (IBAction)clickBtn:(UIButton *)sender {
        
        self.loadingView.hidden = NO;
        self.loadingView.backgroundColor = [UIColor colorWithRed:241/255.0 green:170/255.0 blue:102/255.0 alpha:1.0];
        self.loadingView.layer.cornerRadius = 10.0;
        self.loadingView.layer.masksToBounds = YES;
        sender.hidden = YES;
        
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            
            if ([self.delegate respondsToSelector:@selector(footerViewDidClickLoadBtn:)]) {
                
                [self.delegate footerViewDidClickLoadBtn:self];
            }
            self.loadingView.hidden = YES;
            self.loadBtn.hidden = NO;
        });
    
    }
    @end

    这里用到了代理方法:按钮点击后tableView监听按钮的点击事件

    四:自定义header

    #import <UIKit/UIKit.h>
    
    @interface LLHeaderView : UIView
    
    + (instancetype)headerView;
    
    @end
    #import "LLHeaderView.h"
    #define IMAGEW 260
    @interface LLHeaderView ()<UIScrollViewDelegate>
    
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
    
    @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
    @property (nonatomic, strong) NSTimer *timer;
    
    @end
    
    @implementation LLHeaderView
    
    + (instancetype)headerView
    {
        LLHeaderView *headerView = [[[NSBundle mainBundle] loadNibNamed:@"LLHeaderView" owner:nil options:nil] lastObject];
        headerView.backgroundColor =  [UIColor colorWithRed:241/255.0 green:170/255.0 blue:102/255.0 alpha:1.0];
        return headerView;
    }
    
    - (void)awakeFromNib
    {
        // 1,加载scrollView;
        [self loadScrollView];
        
        // 2,控制pageControl
        self.scrollView.delegate = self;
        
        // 3,自动滚动
        [self startTimer];
    }
    
    - (void)nextImage
    {
        NSInteger page = self.pageControl.currentPage;
        if (page == self.pageControl.numberOfPages - 1) {
            page = 0;
        } else {
            page++;
        }
        self.scrollView.contentOffset = CGPointMake(page * IMAGEW, 0);
    }
    
    #pragma mark - scrollView的代理
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGPoint point = self.scrollView.contentOffset;
        self.pageControl.currentPage = (point.x + IMAGEW * 0.5) / IMAGEW;
        
    }
    
    // 开启定时器
    - (void)startTimer
    {
        NSTimer *timer = [NSTimer timerWithTimeInterval:2.0 target:self selector:@selector(nextImage) userInfo:nil repeats:YES];
        self.timer = timer;
        NSRunLoop * loop = [NSRunLoop currentRunLoop];
        [loop addTimer:self.timer forMode:NSRunLoopCommonModes];
    
    }
    
    - (void)stopTimer
    {
        [self.timer invalidate];
        self.timer = nil;
    }
    
    - (void)loadScrollView
    {
        int count = 5;
    //    CGFloat imageW = 260;
        CGFloat imageY = 0;
        CGFloat imageH = 100;
        for (int i = 0; i<count; i++) {
            
            UIImageView *imageView = [[UIImageView alloc] init];
            [self.scrollView addSubview:imageView];
            CGFloat imageX = i * IMAGEW;
            NSString *name = [NSString stringWithFormat:@"ad_0%d", i];
            imageView.image = [UIImage imageNamed:name];
            imageView.frame = CGRectMake(imageX, imageY, IMAGEW, imageH);
        }
        self.scrollView.contentSize = CGSizeMake(count * IMAGEW, 0);
        self.scrollView.showsHorizontalScrollIndicator = NO;
        self.scrollView.pagingEnabled = YES;
        self.pageControl.currentPageIndicatorTintColor = [UIColor redColor];
        self.pageControl.pageIndicatorTintColor = [UIColor blueColor];
        self.pageControl.numberOfPages = count;
    }
    
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        [self stopTimer];
        
    }
    
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    {
        [self startTimer];
    }
    
    
    @end

    五:控制器

    #import "ViewController.h"
    #import "LLGroup.h"
    #import "LLGroupCell.h"
    #import "LLFooterView.h"
    #import "LLHeaderView.h"
    @interface ViewController ()<UITableViewDataSource, LLFooterViewDelegate>
    
    @property (nonatomic, weak) UITableView *tableView;
    @property (nonatomic, strong) NSMutableArray *groups;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        [self loadTableView];
        NSLog(@"%@", NSHomeDirectory());
    }
    
    #pragma mark - 加载tableView
    - (void)loadTableView
    {
        // 1,创建tableView
        UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) style:UITableViewStylePlain];
        [self.view addSubview:tableView];
        self.tableView = tableView;
        
        // 2, 设置tableView的数据源对象
        self.tableView.dataSource = self;
        
        // 3,设置tableView的行高
        self.tableView.rowHeight = 60;
        
        // 4,设置tableView的分割线的颜色
        self.tableView.separatorColor = [UIColor colorWithRed:0/255.0 green:255/255.0 blue:0/255.0 alpha:1.0];
        
        // 5,设置tableView的footerView
        LLFooterView *footerView = [LLFooterView footerView];
        self.tableView.tableFooterView = footerView;
        
        // 6,设置tableView为footerView的代理
        footerView.delegate = self;
        
        // 7, 设置tableView的headerView
        LLHeaderView *headerView = [LLHeaderView headerView];
        self.tableView.tableHeaderView = headerView;
        
    }
    
    #pragma mark - footerView的代理方法
    - (void)footerViewDidClickLoadBtn:(LLFooterView *)footerView
    {
        LLGroup *group = [[LLGroup alloc] init];
        group.title = @"兰州拉面";
        group.price = @"20";
        group.buyCount = @"200";
        group.icon = @"2c97690e72365e38e3e2a95b934b8dd2";
        
        [self.groups addObject:group];
        
        // 刷新数据:因为tableView并不知道数据中多了一行,因此不能用刷新单行的方法,会报错
        [self.tableView reloadData];
        
        // 将加载后的行自动上滚
        NSIndexPath *path = [NSIndexPath indexPathForRow:self.groups.count - 1 inSection:0];
        [self.tableView scrollToRowAtIndexPath:path atScrollPosition:UITableViewScrollPositionBottom animated:YES];
    }
    
    #pragma mark - 数据源方法
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.groups.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 1,创建cell
        LLGroupCell *cell = [LLGroupCell groupCellWith:tableView];
        // 2,设置数据
        cell.group = self.groups[indexPath.row];
        
        return cell;
        
    }
    
    #pragma mark - 懒加载数据
    - (NSMutableArray *)groups
    {
        if (!_groups) {
            
            _groups = [LLGroup groupList];
        }
        return _groups;
    }
    @end

    效果:

  • 相关阅读:
    采用[ICONIX] 方法实践BLOG设计之二 [用例建模]
    Java平台AOP技术研究
    AOP技术基础
    使用 Windows Vista 的凭据提供程序创造自定义的登录体验
    采用[ICONIX] 方法实践BLOG设计之一 [问题域建模]
    软件工程知识体系全景图
    .Net平台AOP技术研究
    采用[ICONIX] 方法实践BLOG设计之四 [健壮性分析]
    采用[ICONIX] 方法实践BLOG设计之三 [需求复核]
    AOP——引言
  • 原文地址:https://www.cnblogs.com/-boy/p/4129009.html
Copyright © 2020-2023  润新知