前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >iOS-NSArray与Model模型

iOS-NSArray与Model模型

原创
作者头像
Wilbur-L
修改2021-08-13 11:19:56
6250
修改2021-08-13 11:19:56
举报
文章被收录于专栏:iOS底层原理iOS底层原理

一·应用场景

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一·应用场景
    • 1.如何快速写一个UITableView
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档