美文网首页
教你写带网络请求,上拉下拉的baseViewController

教你写带网络请求,上拉下拉的baseViewController

作者: 5a9c6f44e578 | 来源:发表于2017-04-21 11:19 被阅读334次

    为了减少重复代码,方便后续优化,决定研究下baseViewController
    所谓baseViewController就是自己写的父类ViewController,其他页面继承,减少重复代码

    首先想到就是返回按钮

    但不是每个页面都会有方法放到.h中, .m中写方法,不需要在viewDidLoad中实现,继承后在viewDidLoad 中self 该方法 实现,这样就能添加实现返回按钮
    .h

    // 返回按钮
    - (void)AddNavigationRetunItem;
    

    .m

    #pragma mark ====  添加返回按钮
    - (void)AddNavigationRetunItem{
        self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithImage:[UIImage imageNamed:@"left_white_arrow"] style:(UIBarButtonItemStylePlain) target:self action:@selector(returnTopView)];
    }
    
    - (void)returnTopView{
        [self.navigationController popViewControllerAnimated:YES];
    }
    
    

    </br>

    第2 初始一个tableView

    里面不用写代理和数据源写上重复用的诸如初始化,.h放属性.m中懒加载
    另外,不要放到.m延展里面 继承不出来

    .m

    #pragma mark  ====   懒加载
    - (UITableView *)mainTableView{
        if (_mainTableView == nil){
            // 全屏  特殊情况在修改  设置从导航栏底部开始计算
            _mainTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 0,selfWidth , selfHeigh - 64)];
            //隐藏cell线
            _mainTableView.separatorStyle =  UITableViewCellSeparatorStyleNone;
            // 隐藏滑动条
            _mainTableView.showsVerticalScrollIndicator = NO;
            // tableView多余cell空白
            _mainTableView.tableFooterView = [[UIView alloc]init];
        }
        return _mainTableView;
    }
    

    </br>

    第3 等待动画 使用三方HUD

    这个可以全部写在.m里面,每个页面都会有网络请求

        self.HUD = [[MBProgressHUD alloc] initWithView:self.view];
        
        _HUD.labelText = @"等待中";
        // 动画 样式
        _HUD.mode = MBProgressHUDModeIndeterminate;
        
        [_HUD show:YES];
        
        [self.view addSubview:_HUD];
    

    </br>

    第4 网络请求

    请求分为GET和POST, .h接口外放网址和参数字典, .m实现接口成功时返回数据,因此要用带参数的block异步回调数据,
    .h

    //在这里面写入网络请求成功后的数据解析以及其它代码
    @property(nonatomic,copy)void(^GetSuccess)(id GetData);
    //  post 返回
    @property(nonatomic,copy)void(^PostSuccess)(id PostData);
    //  get 请求  数据
    - (void)GetRequsetDataUrlString:(NSString *)url Parameters:(NSDictionary *)dic;
    //  post  请求
    - (void)PostRequsetDataUrlString:(NSString *)url Parameters:(NSDictionary *)dic;
    

    .m

    //  get 请求  数据
    - (void)GetRequsetDataUrlString:(NSString *)url Parameters:(NSDictionary *)dic{
        
         __weak typeof(self) WeakSelf = self;
    
        [Tools GET:url parameters:dic success:^(id  responseObject) {
            
            [WeakSelf.HUD removeFromSuperview];
            
            WeakSelf.GetSuccess(responseObject);
       
        } failure:^(NSError *error) {
            NSLog(@"网络请求失败:%@",error);
        }];
    }
    
    
    
    // post 请求 数据
    - (void)PostRequsetDataUrlString:(NSString *)url Parameters:(NSDictionary *)dic{
        
        __weak typeof(self) WeakSelf = self;
        [Tools POST:url  parameters:dic success:^(id responseObject) {
        
            [WeakSelf.HUD removeFromSuperview];
            
             WeakSelf.PostSuccess(responseObject);
            
        } failure:^(NSError *error) {
            NSLog(@"网络请求失败:%@",error);
        }];
    }
    

    使用方法

    #pragma mark =====  get 请求
        [self GetRequsetDataUrlString:@"http://app.51zzj.com.cn/api/user/index/initFlag.htm" Parameters:nil];
        self.GetSuccess=^(id jsonObject){
            NSLog(@"get :%@",jsonObject);
        };
    
        
    #pragma mark =====  post 请求
        NSDictionary *parameters = @{@"token": @"1d68740c62ba426985ad500c69eb818d" , @"questionId":@"QUS00000013" , @"condition" : @"Dwawawawdadaadwaw" , @"userId":@"USR00000148"};
        //
        [super PostRequsetDataUrlString:@"http://app.51zzj.com.cn/api/question/detail/reply.htm" Parameters:parameters];
        self.PostSuccess=^(id jsonObject){
                    NSLog(@"get :%@",jsonObject);
        };
    

    </br>

    第五 上拉加载下拉刷新 使用推荐MJRefresh来实现

    因为不一定每个页面都有刷新所以还是.h放接口,.m实现不需要加到ViewDidLoad中
    为了区分上拉下拉写一个属性
    上拉或者下拉时用block回调不需要传递,写不带参block就好
    .h

    // 创建  上拉 下拉 刷新
    - (void)createMJRefresh;
    //  下拉  返回
    @property(nonatomic,copy)void(^header)();
    //   上拉 返回
    @property(nonatomic,copy)void(^footer)();
    // 判断 上拉  下拉   下拉  10  上拉  11      没有关联的12
    @property (nonatomic, assign)NSInteger judge;
    

    .m

    //  创建  MJ刷新
    - (void)createMJRefresh{
        
        //下拉  刷新
        self.mainTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
            //开始刷新数据
            [self.mainTableView.mj_header beginRefreshing];
            
            self.judge = 10;
            
            self.header();
        }];
        
        
        //上拉   加载
        self.mainTableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
            //开始刷新数据
            [self.mainTableView.mj_footer beginRefreshing];
    
            _judge = 11;
            
            self.footer();
        }];
    }
    

    实现

    
    - (void)viewDidLoad {
        [super viewDidLoad];
       
        // 初始值  通过修改该数组来增加请求数
        self.newsIndex = 1;
        
        //  添加  下拉  上拉
        [self createMJRefresh];
        //  网络请求
        [self MJRequestData];
        
        // 防止 block  循环 引用
        __weak typeof(self) WeakSelf = self;
        
        //  下拉 实现
        self.header = ^{
            [WeakSelf MJRequestData];
        };
        
        // 上拉  实现
        self.footer = ^{
            [WeakSelf MJRequestData];
        };
        
        
        //  添加 主tableView
        self.mainTableView.rowHeight = 125;
        self.mainTableView.delegate = self;
        self.mainTableView.dataSource = self;
        // 注册 重用名
        [self.mainTableView registerClass:[expertsLibraryTVCell class] forCellReuseIdentifier:@"expertsLibraryTVCell"];
        [self.view addSubview: self.mainTableView];
    }
    
    
    
    //  mj 请求数据
    - (void)MJRequestData{
        if (self.judge == 10) {
            // 下拉时 清空数据数组 重新请求添加
            self.newsIndex = 1;
            [self.dataArray removeAllObjects];
        } else if (self.judge == 11){
            // 上拉时  数组中添加内容
            self.newsIndex++;
        }
             __weak typeof(self) WeakSelf = self;
        
        //转换一下
        NSString *Number = [NSString stringWithFormat:@"%ld",(long)self.newsIndex];
        
        NSDictionary *parameters = @{@"pageNum": Number, @"pageSize":@"10",@"content" : @""};
        
        //网络请求
        NSString *urlString = [Tools RequestnetworkString:@"expert/list/init.htm"];
        
        [super PostRequsetDataUrlString:urlString Parameters:parameters];
        self.PostSuccess=^(id responseObject){
            //    解析出来的关键字
            NSArray *rootArray = responseObject[@"businessData"];
            
            for (NSDictionary *smallDict in rootArray) {
                
                expertsLibraryModel *model = [[expertsLibraryModel alloc] init];
                
                [model setValuesForKeysWithDictionary:smallDict];
                
                [WeakSelf.dataArray addObject:model];
                
            }
     
            //刷新数据
            [WeakSelf.mainTableView reloadData];
            
            [WeakSelf.mainTableView.mj_header endRefreshing];
            
            if (rootArray.count == 0) {
                // 为零时 实现没有更多数据
                [WeakSelf.mainTableView.mj_footer endRefreshingWithNoMoreData];
            } else {
                [WeakSelf.mainTableView.mj_footer endRefreshing];
            }
        };
    }
    
    

    最后可以加上些常用的 比如背景色之类的

        // 背景色
        self.view.backgroundColor = [UIColor whiteColor];
    
        //  从导航栏 计算 位置
        self.edgesForExtendedLayout = UIRectEdgeNone;
    
        // 导航栏 颜色
        self.navigationController.navigationBar.barTintColor = [UIColor redColor];
        
        //  导航栏 按钮  颜色
        self.navigationController.navigationBar.tintColor  = [UIColor whiteColor];
    

    附上demo
    http://git.oschina.net/wwwzz/baseviewcontrollerdemo

    相关文章

      网友评论

          本文标题:教你写带网络请求,上拉下拉的baseViewController

          本文链接:https://www.haomeiwen.com/subject/jfgkzttx.html