一 左边的类别数据

  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 = ;
self.textLabel.height = self.contentView.height - * 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(, , ) : BSRGBColor(, , );
}

  6 默认选中首行

        //默认选中首行
[self.categoryTableView selectRowAtIndexPath:[NSIndexPath indexPathForRow: inSection:] animated:NO scrollPosition:UITableViewScrollPositionTop];

  

二 右边的用户数据

  设置inset布局,保证两个tableview的inset相同

    //设置inset
self.automaticallyAdjustsScrollViewInsets = NO; self.categoryTableView.contentInset = UIEdgeInsetsMake(, , , );
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 == ); 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];
}

八 补充

九 分页的2种做法

  1 将页码传给服务器

  2 将id传给服务器

十 推荐标签01-显示标签数

  1 加载自定义的cell

    给自定义的cell设置标识

    在tableview控制器中加入头文件

    注册cell(需要标识符)

    在cellForRow方法中返回cell(需要标识符)

  2 控制数据在不同数据范围之间的不同显示

    NSString *subNumber = nil;
if (recommentTag.sub_number < ) {
subNumber = [NSString stringWithFormat:@"%zd人订阅", recommentTag.sub_number];
}else{
subNumber = [NSString stringWithFormat:@"%.1f万人订阅", recommentTag.sub_number / 10000.0];
}
self.subNumberLabel.text = subNumber;

  

十一 推荐标签02-cell之间的间隙

  1 减小contentView的宽度和左间距,cell设置为clearColor

  2 设置cell的左间距,然后使cell的高度宽度变小,使间隙成为分割线

  3 使得不可轻易改变自定义控件的frame

- (void)setFrame:(CGRect)frame
{
frame.origin.x = ;
frame.size.width -= * frame.origin.x;
frame.size.height -= ;
[super setFrame:frame];
}

BSBuDeJie_02的更多相关文章

随机推荐

  1. 微信5.4安卓版重回ios风格 导航菜单都放底栏位置

    微信5.4安卓版发布更新了,由于本人的手机设置软件自动更新,中午的时候才发现微信换成了5.4版本,启动微信后是一个大大的“转账,就是发消息”,进入微信界面有点小惊喜,导航菜单都改为底部tab方式,顶部 ...

  2. JS跨域(ajax跨域、iframe跨域)解决方法及原理详解(jsonp)

    这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被 ...

  3. python的os模块

    1.得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 2.返回指定目录下的所有文件和目录名:os.listdir() 3.函数用来删除一个文件:os.remove() ...

  4. Python里*arg 和**kwargs的作用

    Hi,伙计们.我发现Python新手们在理解*args和**kwargs这两个魔法变量时都有些困难.他们到底是什么?首先,我先告诉大家一个事实,完整地写*args和**kwargs是不必要的,我们可以 ...

  5. jQuery视差滚动插件,(附原理分析,调用方法)

    演示地址:http://www.jq22.com/jquery-info1799 jquery插件,使用验证过可用. 分析源代码后总结原理:设置background样式为fixed,判断浏览器滚动距离 ...

  6. Effective Python2 读书笔记1

    Item 2: Follow the PEP 8 Style Guide Naming Naming functions, variables, attributes lowercase_unders ...

  7. 懵逼的闭包--for循环(转)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. 【转】详解Java正则表达式语法

    (转自: http://www.jb51.net/article/76354.htm) 这篇文章主要介绍了Java正则表达式语法,包括常用正则表达式.匹配验证-验证Email是否正确以及字符串中查询字 ...

  9. Select查询执行顺序

    链接:http://blog.jobbole.com/55086/ 很多程序员视 SQL 为洪水猛兽.SQL 是一种为数不多的声明性语言,它的运行方式完全不同于我们所熟知的命令行语言.面向对象的程序语 ...

  10. 【翻译】ASP.NET MVC 5属性路由(转)

    转载链接:http://www.cnblogs.com/thestartdream/p/4246533.html 原文链接:http://blogs.msdn.com/b/webdev/archive ...