zoukankan      html  css  js  c++  java
  • iOS之UITableView的上拉刷新

    #import "ViewController.h"
    #import "UITableView+PullRefresh.h"
    
    @interface ViewController ()<UITableViewDataSource, UITableViewDelegate>
    
    @property (strong, nonatomic)NSMutableArray *arrData;
    @property (strong, nonatomic)NSMutableArray *arrTmp;
    
    @property (strong, nonatomic)UITableView *tabv;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 初始化临时动态集合
        self.arrTmp = [NSMutableArray array];
        
        // 获取数据源
        self.arrData = [NSMutableArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"2.只包含地级市" ofType:@"plist"]];
        
        // 创建表视图
        self.tabv = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];
        
        // 指定代理
        self.tabv.dataSource = self;
        self.tabv.delegate = self;
        
        // 注册唯一标识
        [self.tabv registerClass:[UITableViewCell class] forCellReuseIdentifier:@"reuse"];
        
        // 添加到主视图
        [self.view addSubview:self.tabv];
    
        
        // 启动
        [self.tabv setup];
        // 加载
        [self.tabv setLoadMoreEnable:YES];
        // 避免强引用循环
        __weak typeof(self)weakSelf = self;
        // 回调
        [self.tabv setLoadingBlock:^(BOOL pullDown)
        {
            [weakSelf sendMessage:!pullDown];
        }];
    }
    
    - (void)sendMessage:(BOOL)isloadMore
    {
        if (!isloadMore)
        {
            [self.arrTmp removeAllObjects];
        }
        // 变量的声明只会走一次,因此即使是在函数或者block中声明的静态变量赋初值也只会走一次,所以多次调用如果是static每次调用是不会被清空的会被保存下来
        // NSInteger num = 0;  // 因为indexPath所以都一样,初值赋值多少都一样(但需要赋值为0,否则会提前崩),静态和普通变量都一样:从集合数据源下标的row=0开始
        static NSInteger num = 0;
        // 控制结束和每次刷新的数量
        static NSInteger range = 200;
        // 每次刷新都是把数据源的数据添加到临时的动态集合
        for (NSInteger i = num; i < num+range; i++)
        {
            [self.arrTmp addObject:self.arrData[i]];
        }
        // 判断集合数量避免下标越界程序崩溃
        if (self.arrData.count-self.arrTmp.count<range)
        {
            range = self.arrData.count - self.arrTmp.count;
        }else  //取差赋值给添加刷新数量:小于默认刷新数量时
        {
            num += range;
        }
        // 调用方法刷新临时集合内数据源
        if (self.arrData.count > self.arrTmp.count)
        {
            [self.tabv setLoadMoreEnable:YES];
        }else  //等于时也停止加载
        {
            [self.tabv setLoadMoreEnable:NO];
        }
        // 刷新显示在tabView上数据
        [self.tabv reloadData];
    }
    
    // 显示row的数量
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        // tmp的数量:默认先加载20条
        if (!self.arrTmp.count)
        {
            return 20;
        }else //  刷新即显示临时集合内数据:把数据源分段添加到临时集合
        {
            return self.arrTmp.count;
        }
    }
    // 显示数据
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"reuse" forIndexPath:indexPath];
        
        if (self.arrData.count!=indexPath.row)
        {
            cell.textLabel.text = self.arrData[indexPath.row];
        }
        
        return cell;
    }
    @end
  • 相关阅读:
    面试题系列---【watch、methods 和 computed 的区别】
    面试题系列---【vue-router是什么?有哪些路由模式?实现原理是什么】
    面试题系列---【vue中watch原理】
    面试题系列--【解决移动端1px边框问题】
    面试题系列---【vue中assets和static目录的区别】
    面试题系列---【vue中router和route区别】
    面试题系列---【mvvm 和 mvc 区别是什么?哪些场景适合?】
    面试题系列---【接口调不通,如何排查问题?】
    面试题系列---【手写一个Promise】
    JavaScript课程——Day11(BOM,宽高位置属性)
  • 原文地址:https://www.cnblogs.com/pruple/p/5330739.html
Copyright © 2011-2022 走看看