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