IOS开发之——团购网站-加载更多数据(5)

一 概述

本文在团购页面的基础上添加下面的功能:

  • 下拉到底部时,加载更多页面的搭建
  • 设置代理传递按钮被点击事件
  • 刷新全部数据和刷新单条数据
  • 代理的optional和if预处理指令

二 功能详述

2.1 加载更多页面

  • 新建TgFooterView.xib用于做加载更多数据的布局页面

  • 在ViewController.m中,给tableView.tableFooterView指定上述布局

    1
    self.tableView.tableFooterView=[[[NSBundle mainBundle]loadNibNamed:@"TgFooterView" owner: nil options:nil] lastObject];
  • 控制加载点击按钮与加载中按钮的显示与隐藏逻辑

    • 默认隐藏加载中布局,显示加载按钮
    • 点击加载按钮后,隐藏加载按钮,显示加载中视图
    • 数据请求到后,隐藏加载中视图,显示加载按钮

2.2 设置代理传递按钮被点击事件

  • TgFooterView中定义代理与代理属性

    1
    2
    3
    4
    5
    6
    7
    @class TgFooterView;
    @protocol TgFootViewDelegate <NSObject>
    @optional
    //视图的下载按钮被点击
    - (void)footViewDidDownloadButtonClick:(TgFooterView *)footVIew;
    @end
    @property (nonatomic,weak) id <TgFootViewDelegate> delegate;
  • ViewController.m中继承代理,实现代理中方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @interface ViewController ()<TgFootViewDelegate>

    - (void)footViewDidDownloadButtonClick:(nonnull TgFooterView *)footVIew {
    NSLog(@"努力加载数据中。。");
    //向数组中添加数据,模拟网络添加数据的效果
    NSDictionary *dict=@{@"title":@"标题",@"icon":@"ad_00",@"price":@"100.2",@"buyCount":@"250"};
    TG *tg=[TG tgWithDict:dict];
    [self.tgs addObject:tg];
    //刷新数据
    //[self.tableView reloadData];
    NSIndexPath *path=[NSIndexPath indexPathForRow:self.tgs.count-1 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle];
    }
  • 给TgFooterView指定代理

    1
    2
    3
    TgFooterView *footer=[TgFooterView footView];
    footer.delegate=self;
    self.tableView.tableFooterView=footer;

2.3 刷新全部数据和刷新单条数据

  • 刷新全部数据(不推荐)

    1
    [self.tableView reloadData];
  • 刷新单条数据

    1
    2
    NSIndexPath *path=[NSIndexPath indexPathForRow:self.tgs.count-1 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle];

2.4 代理的optional和if预处理指令

  • optional

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //TgFooterView.h
    @optional
    //视图的下载按钮被点击
    - (void)footViewDidDownloadButtonClick:(TgFooterView *)footVIew;

    //TgFooterView.m
    //判断代理是否实现了协议方法
    if ([self.delegate respondsToSelector:@selector(footViewDidDownloadButtonClick:)]) {
    [self.delegate footViewDidDownloadButtonClick:self];
    }
  • if预处理指令(if 为0不会执行代理,为1会执行)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #if 1
    - (void)footViewDidDownloadButtonClick:(nonnull TgFooterView *)footVIew {
    NSLog(@"努力加载数据中。。");
    //向数组中添加数据,模拟网络添加数据的效果
    NSDictionary *dict=@{@"title":@"标题",@"icon":@"ad_00",@"price":@"100.2",@"buyCount":@"250"};
    TG *tg=[TG tgWithDict:dict];
    [self.tgs addObject:tg];
    //刷新数据
    //[self.tableView reloadData];
    NSIndexPath *path=[NSIndexPath indexPathForRow:self.tgs.count-1 inSection:0];
    [self.tableView insertRowsAtIndexPaths:@[path] withRowAnimation:UITableViewRowAnimationMiddle];
    }
    #endif

三 效果