一 左边的类别数据
1 模型 和 字典中的数据对应
/* id */ @property (nonatomic, assign) NSInteger *id; /* 总数 */ @property (nonatomic, assign) NSInteger count; /* 名字 */ @property(nonatomic, copy) NSString *name;
2 字典转模型
//字典转模型 self.categories = [BSRecommentCategory mj_objectArrayWithKeyValuesArray:responseObject[@"list"]];
3 this class is not key value coding-compliant for the key id.
一般是IB中的链接设置有问题,有无效的链接,比如将某个outlet名字改了,而没有把这个链接删除,同时可以确认下项目的plist文件是否有关于IB的设置,如果有删除即可
4 从新调整内部的textlabel的frame
- (void)layoutSubviews { [super layoutSubviews]; //重新调整内部textLabel的frame self.textLabel.y = 2; self.textLabel.height = self.contentView.height - 2 * self.textLabel.y; }
5 选中cell时,内部的子控件不会显示高亮
可以在这个方法中监听cell的选中和取消选中
- (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; self.selectedIndicator.hidden = !selected; self.textLabel.textColor = selected ? BSRGBColor(219, 21, 26) : BSRGBColor(78, 78, 78); }
6 默认选中首行
//默认选中首行 [self.categoryTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UITableViewScrollPositionTop];
二 右边的用户数据
设置inset布局,保证两个tableview的inset相同
//设置inset self.automaticallyAdjustsScrollViewInsets = NO; self.categoryTableView.contentInset = UIEdgeInsetsMake(64, 0, 0, 0); self.userTableView.contentInset = self.categoryTableView.contentInset;
三 解决重复请求
得到点击的行号
self.categoryTableView.indexPathForSelectedRow.row
四 加载第二页数据
刷新控件<MJRefresh.h>
//添加刷新控件 - (void)setupRefresh { self.userTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingBlock:^{ BSLog(@"进入上拉刷新"); }]; self.userTableView.mj_footer.hidden = YES; }
//让底部控件结束刷新 [self.userTableView.mj_footer endRefreshing];
//没有更多数据 [self.userTableView.mj_footer endRefreshingWithNoMoreData];
五 加载更多页数据
六 下拉上拉
1 头部上拉
//添加刷新控件 - (void)setupRefresh { self.userTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewUsers)]; self.userTableView.mj_footer = [MJRefreshAutoNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreUsers)]; self.userTableView.mj_footer.hidden = YES; }
2 可以通过自定义的属性来判断数据的加载
//时刻监测footer的状态 - (void)checkFooterState { BSRecommentCategory *rc = BSSelectedCategory; NSInteger count = rc.users.count; //每次刷新右边数据时,都控制footer显示或隐藏 self.userTableView.mj_footer.hidden = (count == 0); if(count == rc.total){ [self.userTableView.mj_footer endRefreshingWithNoMoreData]; }else{ [self.userTableView.mj_footer endRefreshing]; } }
3 在下拉刷新时,可能会将第一页数据存入数组多次
//清除所有旧数据 [rc.users removeAllObjects]; //添加到当前类对应的用户数组中 [rc.users addObjectsFromArray:users];
七 控制器销毁处理
1 多次发送请求时,只处理最后一次请求
每发一次请求,就会有一个全新的params
self.params = params; [[AFHTTPSessionManager manager] GET:@"http://api.budejie.com/api/api_open.php" parameters:params progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { if (self.params == params) return;
2 如果有一个控制器请求正在发送,但是控制器已被销毁,此时怎么处理
将请求销毁,阻止AFN请求回来再次访问
/* AFN请求管理者 */ @property (nonatomic, strong) AFHTTPSessionManager *manager;
#pragma mark - 控制器的销毁 - (void)dealloc { [self.manager.operationQueue cancelAllOperations]; }
八 补充
1
2
3
九 分页的2种做法
十 推荐标签01-显示标签数
十一 推荐标签02-cell之间的间隙
十二 键盘处理
时间: 2024-10-13 00:52:21