一·应用场景
在日常开发中写页面UI,必定离不开与后端的数据JSON交互
1.如何快速写一个UITableView
Step1:UITableView懒加载
代码语言:javascript复制- (UITableView *)tableView {
if(!_tableView){//alloc init 初始化一个TableView}
}
Step2.继承Delegate&DataSource
这里举几个重要的必须实现的协议方法
代码语言:javascript复制- (void)didSelectRowAtIndexPath {
//这里实现cell是否可点击 可点击进去一个新的VC tableView
yourModel *model = self.dataArr[indexPath.row];
yourNextVC *vc = [youNextVC alloc]init];
这里可以通过model层数据传递进去你想要的值
vc.balabala = model.balabala //model层数据和vc层数据最好是相对应 不然
//我给你表演一个什么叫牛头不对马嘴
vc.type = model.color //这一句是错误代码 很令人头疼
vc.navigationItem.title = @"whatever 油 what ";
[self.navigationController pushViewController:vc animated:NO];
}
代码语言:javascript复制- (NSInterger)numberOfRowsInSection {
return self.dataArr.count //决定有多少个cell
}
代码语言:javascript复制-(UITableViewCell *)cellForRowAtIndexPath {
static NSString *Id = @"这里写每个Cell的样式/可以是Xib或者纯代码";
yourCell *cell = [tableView dequeueReusableCellWithIdentifier:Id]; //cell复用
//复用的主要作用是避免过度使用内存来初始化差不多相同的Cell
if (!cell){
//这里做cell是否存在的判断
cell = [yourCell alloc]initWithStyle:UITableViewCellDefault reuseIdentifier:
@"Id" cellType:self.type];
//这里的UITableViewCell 的初始化方法我是重写了构造方法 可以略过
}
if (_dataArr.count > 0){ //JSON大于零说明后端返回有数据
yourModel *model = _dataArr[indexPath.row]; //给每一行不同的cell 赋值上不同的数据
这一块是MVC架构中的Model层 Mark住很重要!!!!!
cell = [yourCell alloc]init]; //任何初始化都可以 随意
cell.model = model //MVC中 model负责数据 VC负责数据传递
}
return cell
}
Step3:网络请求
代码语言:javascript复制- (void)netWork {
//遇事不决先来一个Weak 来预防以后会有用到
__weak typeof(self) weakSelf = self;
通常与后端交互一般通过JSON 返回字典数据结构
NSDictionary *dic = @{
@"code":200,
@"msg":@"成功",
@"time":@([NSString time.now]) //与后端商量需要什么入参
};
[NetWork post:http:192.168.0.1:8080/api/user para:dic success:^(NSDictionary *data,BOOL bools)]
if (bools){ //发送post请求成功
//dataArr 赋值操作有两种不同的操作
这里我写一个老三步 (让子弹飞快申遗)
NSArray *listArr = [NSArray arrayWithArray:dicData[@"结构"][@"需要"][@"和后端"][@"打架(商量)"]];
if (!listArr){ //1.nil值处理
[self.tableView endFresh];
}
for (NSDictionary *d in listArr){ //2.for循环 取出每个数据到字典里
if (![d isEqual:[NSNull new]]){
yourModel *model = [yourModel modelWithDictionary:d];
[weakSelf.dataArr addObject:model];
}
}
//无聊开启一个GCD玩玩 哎 就是玩
dispatch_async(dispatch_get_main_queue(), ^{
if (self.dataArr.count > 0) { //拿到主线程 刷新UI
[self endFresh];
}else{
[weakSelf.tableView reloadData];
}
});
}else {
NSLog(@"msg:%@",dicData[@"msg"]); 老三步走完 还有新三步 可是我不想写
}
}
Step4:下拉刷新 上拉加载
代码语言:javascript复制- (NSMutableArray *)dataArr{
if (!_dataArr){ //如果数组是空
_dataArr = [NSMutableArray array];
}
return _dataArr; //你以为完了吗?还没
}
代码语言:javascript复制Step5:网络请求后的页面刷新
- (void)Refresh{
__weak typeof(self) weakSelf = self;
[self.tableView addNormalHeaderRefresh:YES andRefreshBlock:^(id sender) {
weakSelf.page = 1;
[weakSelf.dataArr removeAllObjects];
[weakSelf netWork];
}];
//尾部刷新
[self.tableView addNormalFooterRefresh:^(id sender) {
weakSelf.page ;
[weakSelf netWork];
}];
}
Step几来着
代码语言:javascript复制- (void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated]; //最后检查VC的生命周期有没有添加animated
}