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

2017-04-21  本文已影响334人  5a9c6f44e578

为了减少重复代码,方便后续优化,决定研究下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

上一篇下一篇

猜你喜欢

热点阅读