美文网首页iOS开发小例子JG专题
iOS Cell中嵌套CollectionView

iOS Cell中嵌套CollectionView

作者: 小時間光 | 来源:发表于2016-03-03 17:26 被阅读5820次
    效果图

    如图所示,近期公司要我负责这个项目的二期开发和维护工作,当我从SVN的上下载代码后我的内心是崩溃的:

    是的,如果你看了首页代码的行数你就可以理解我当时的心情了:

    1200多行的代码!因为一期的开发是外包给别人做的,所以...

    既来之则安之,我结合首页的结构和之前的代码,决定对首页的代码进行重构,我的修改如下:

    1、对于最上面的自定义NavigationController(即上图的蓝线框部分),这里的修改,我将其写一个类,继承自UIView,在viewDidLoad方法中调用初始化并传值;

    2、轮播图(上图绿线框部分)没有做修改,放在Tableview的第一个Cell中;

    3、主要内容(上图黑线框部分),之前的做法是,Tableview一个Cell中放2个View,左边一个右边一个,通过Tag值来标识每个VIew,这块在赋值和点击的时候做了很多判断,具体的...其实我也没仔细研究;最终我决定用TableViewCell嵌套UICollectionView的方法重构这部分代码,我的思路如下图:

    我的思路图

    我在TableviewCell中嵌套一个CollectionView,每次刷新Tableview后,根据服务器返回的数组长度来动态改变TableviewCell的高度,如下图所示,这是我修改后的storyboard中Tableview结构图:

    Tableview结构图

    在Controller中实现Tableview的回调方法,

    当接收到服务器的数据后,利用MJExtension框架将从服务器获取的数据转换为Model,传给Controller,此时刷新Tableview,通过一个变量来记录上拉刷新的次数,并计算TableviewCell的高度;

    /**
     *记录上拉刷新的次数默认为2
     */
    @property(assign,nonatomic)intNum;
    /**
     *记录上拉刷新的次数默认为1 
     */
    @property(assign,nonatomic)intNum;
    - (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath
    {
       returnself.Num*155+5;
    }

    在TableviewCell中实现UICollectionView的回调方法。

    @interface HomeTableViewCell :UITableViewCell<UICollectionViewDelegate,UICollectionViewDataSource>

    在TableviewCell中通过代理来传点击的是哪一个CollectionViewCell,


    /**
     * 代理,用来传递点击的是第几行,当触CollectionView的时候
     */
     @protocoldelegateColl
    
      -(void)ClickCooRow :(int)CellRow;
    
    @end
    @property(weak,nonatomic)id <delegateColl> delegateColl;
    
    -(void)collectionView:(UICollectionView*)collectionView didSelectItemAtIndexPath:(NSIndexPath*)indexPath
    {
       UICollectionViewCell* cell = (UICollectionViewCell*)[collectionViewcellForItemAtIndexPath:indexPath];
       cell.backgroundColor= [UIColorwhiteColor];
       //代理传值
      if([self.delegateCollrespondsToSelector:@selector(ClickCooRow:)])
      {
         self.delegateCollClickCooRow:indexPath.row];
      }
    }

    在Controller中实现回调方法,用来接收点击的是哪张图片:



    #pragma mark -代理用来接收点击的是第几个
    -(void)ClickCooRow :(int)CellRow
    {
    printf("\n点击的是==========%d\n",CellRow);
    }

    重构后,增加了2个类和1个Model类,但是首页的代码也瘦了很多。逻辑也清晰了,如下图是我重构后的首页代码结构和代码行数:

    由于这是公司的项目不能提供代码了,笔者写了个Demo供参考,请戳:下载地址

    PS:如果有什么待优化的地方或大家有更好的解决方案,求指点。

    相关文章

      网友评论

      • 峰子1994:再不问下就是我重用了cell那collection咋弄
      • eac6ebd56d25:楼主你好,tableviewCell我也作为Collectionview的数据源和代理,但是每次单击Collectionview的Cell无效果,长按松开才进入collectionView的点击代理方法,这是什么情况你知道吗?
      • 牛蛋:大神 在吗 ? 我按照你做的demo tableViewcell中能够显示出来 但是collection的 didSelectItemAtIndexPath不被调用啊 是怎么回事啊
        小時間光:@牛蛋 没有实现代理吧。
      • 2068e5e51f60:把代码放到```里面吧,看起来有点乱

      本文标题:iOS Cell中嵌套CollectionView

      本文链接:https://www.haomeiwen.com/subject/mrzlkttx.html