iOS-NSArray与Model模型

2021-08-13 11:19:56 浏览数 (1)

一·应用场景

在日常开发中写页面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 
}

0 人点赞