• QQList列表功能实现


    1.模型

    @class FriendsModel;

    @interface GroupModel : NSObject


    @property (nonatomic, copy) NSString *name;

    @property (nonatomic, copy) NSString *online;

    @property (nonatomic, strong) NSArray *friends;

    @property (nonatomic, strong) FriendsModel *friendModel;

    @property (nonatomic, assign) BOOL isOpen;

    - (instancetype)initWithDict:(NSDictionary *)dict;

    + (instancetype)GroupWithDict:(NSDictionary *)dict;


    @end


    #import "FriendsModel.h"

    @implementation GroupModel


    - (instancetype)initWithDict:(NSDictionary *)dict{

        if (self = [super init]) {

            [self setValuesForKeysWithDictionary:dict];

            NSMutableArray *muArray = [NSMutableArray array];

            for (NSDictionary *dict in self.friends) {

                FriendsModel *model = [FriendsModel friendWithDict:dict];

                [muArray addObject:model];

            }

            self.friends = muArray;

        }

        return self;

    }

    + (instancetype)GroupWithDict:(NSDictionary *)dict

    {

        return [[self allocinitWithDict:dict];

    }


    @end


    @interface FriendsModel : NSObject


    @property (nonatomiccopyNSString *icon;

    @property (nonatomiccopyNSString *name;

    @property (nonatomiccopyNSString *intro;

    @property (nonatomicassignBOOL isVip;


    - (instancetype)initWithDict:(NSDictionary *)dict;

    + (instancetype)friendWithDict:(NSDictionary *)dict;

    @end




    #import "FriendsModel.h"


    @implementation FriendsModel

    - (instancetype)initWithDict:(NSDictionary *)dict{

        if (self = [super init]) {

            [self setValuesForKeysWithDictionary:dict];

        }

        return self;

    }

    + (instancetype)friendWithDict:(NSDictionary *)dict{

        return [[self allocinitWithDict:dict];

    }

    @end



    2.tableView UITableViewHeaderFooterView
    的继承

    @protocol HeaderViewDelegate <NSObject>


    @optional

    - (void)clickView;

    @end


    @interface HeaderView : UITableViewHeaderFooterView

    @property (nonatomic,assign)id<HeaderViewDelegate> delegate;


    @property (nonatomic,strong) GroupModel *groupModel;

    + (instancetype)headerView:(UITableView *)tableView;

    @end


    #import "HeaderView.h"

    #import “GroupModel.h"


    @implementation HeaderView{

       UIButton *_arrowBtn;

       UILabel  *_label;

    }


    + (instancetype)headerView:(UITableView *)tableView

    {

       staticNSString *identifier =@"header";

       HeaderView *header = [tableViewdequeueReusableCellWithIdentifier:identifier];

       if (!header) {

            header = [[HeaderViewalloc]initWithReuseIdentifier:identifier];

        }

       return header;

    }


    - (instancetype)initWithReuseIdentifier:(NSString *)reuseIdentifier

    {

       if (self = [superinit]) {

            UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];

            [button setBackgroundImage:[UIImageimageNamed:@"header_bg"]forState:UIControlStateNormal];

            [button setBackgroundImage:[UIImageimageNamed:@"header_bg_highlighted"]forState:UIControlStateHighlighted];

            [button setImage:[UIImageimageNamed:@"arrow"]forState:UIControlStateNormal];

            [button setTitleColor:[UIColorblackColor]forState:UIControlStateNormal];

            button.contentEdgeInsets =UIEdgeInsetsMake(0,10,0, 0);

            button.contentHorizontalAlignment =UIControlContentHorizontalAlignmentLeft;

            button.titleEdgeInsets =UIEdgeInsetsMake(0,10,0, 0);

            button.imageView.contentMode =UIViewContentModeCenter;

            [button addTarget:selfaction:@selector(buttonAction)forControlEvents:UIControlEventTouchUpInside];

            //超出范围的图片不要剪切

            button.imageView.clipsToBounds =NO;

           _arrowBtn = button;

            [selfaddSubview:_arrowBtn];

            //创建label,显示当前在线人数

           UILabel *labelRight = [[UILabelalloc]init];

            labelRight.textAlignment =NSTextAlignmentCenter;

           _label = labelRight;

            [selfaddSubview:_label];

        }

        return self;

    }



    #pragma mark - buttonAction

    - (void)buttonAction

    {

       self.groupModel.isOpen = !self.groupModel.isOpen;

       if ([self.delegaterespondsToSelector:@selector(clickView)]) {

            [self.delegateclickView];

        }

    }



    - (void)didMoveToSuperview

    {

        //通知相关视图他们的上级视图已经变化是当某个子控件载入到父控件上得时候调用

        

        _arrowBtn.imageView.transform =self.groupModel.isOpen ?

    CGAffineTransformMakeRotation(M_PI_2) :CGAffineTransformMakeRotation(0);

        

    }


    //布局

    - (void)layoutSubviews

    {

        [superlayoutSubviews];

        _arrowBtn.frame =self.bounds;

        _label.frame =CGRectMake(self.frame.size.width - 70, 0, 60,self.frame.size.height);

    }


    //赋值

    - (void)setGroupModel:(GroupModel *)groupModel

    {

        _groupModel = groupModel;

        [_arrowBtn setTitle:_groupModel.name forState:UIControlStateNormal];

        _label.text = [NSString stringWithFormat:@"%@/%lu",_groupModel.online,(unsignedlong)_groupModel.friends.count];

        

    }


    3.控制器

    #import "ListTableViewController.h"

    #import "GroupModel.h"

    #import "FriendsModel.h"

    #import "HeaderView.h"

    #import "ViewController.h"

    @interface ListTableViewController ()<HeaderViewDelegate>

    @property (nonatomic, strong)NSArray *dataArray;

    @end


    @implementation ListTableViewController

    //懒载入

    - (NSArray *)dataArray{

       if (!_dataArray) {

            NSString *path = [[NSBundlemainBundle]pathForResource:@"friends.plist"ofType:nil];

           NSArray *array = [NSArrayarrayWithContentsOfFile:path];

            NSMutableArray *muArray = [NSMutableArrayarrayWithCapacity:array.count];

           for (NSDictionary *dictin array) {

                GroupModel *groupModel = [GroupModel GroupWithDict:dict];

                [muArray addObject:groupModel];

            }

           _dataArray = [muArraycopy];

        }

        return_dataArray;

        

        

    }

    - (void)viewDidLoad

    {

        [superviewDidLoad];

        

        self.tableView.sectionHeaderHeight =40;//自己定义了sectionHeader一定要设置高

        [selfclipExtraCellLine:self.tableView];//数据不够,去掉以下多余的表格线

    }



    #pragma mark - Table view data source


    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

    {

        return self.dataArray.count;

    }


    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

    {

        GroupModel *groupModel =self.dataArray[section];

       NSInteger count = groupModel.isOpen ? groupModel.friends.count :0;

       return count;

    }


    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    {

       staticNSString *identifier =@"friendCell";

       UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:identifier];

       if (!cell) {

            cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleSubtitlereuseIdentifier:identifier];

            

        }

        GroupModel *groupModel =self.dataArray[indexPath.section];

        FriendsModel *friendModel = groupModel.friends[indexPath.row];

        cell.imageView.image = [UIImage imageNamed:friendModel.icon];

        cell.textLabel.text = friendModel.name;

        cell.detailTextLabel.text = friendModel.intro;

        

       return cell;

    }

    #pragma mark - UITableView delegate

    - (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section

    {

       HeaderView *header = [HeaderViewheaderView:tableView];

        header.delegate =self;

        header.groupModel =self.dataArray[section];

       return header;

    }


    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    {

        ViewController *viewCtrl = [[ViewControlleralloc]init];

        //viewCtrl.view.backgroundColor = [UIColor redColor];

        [self.navigationControllerpushViewController:viewCtrlanimated:NO];

    }


    - (void)clickView

    {

        [self.tableViewreloadData];

    }


    #pragma mark - 去掉多余的线

    - (void)clipExtraCellLine:(UITableView *)tableView

    {

       UIView *view = [[UIViewalloc]init];

        view.backgroundColor = [UIColorclearColor];

        [self.tableViewsetTableFooterView:view];

    }


    /*

     设置视图控制颜色

     

     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

     self.window.backgroundColor = [UIColor whiteColor];

     ListTableViewController *listVC = [[ListTableViewController alloc] init];

     UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:listVC];

     self.window.rootViewController = navCtrl;

     [self.window makeKeyAndVisible];

     */


    素材下载地址:http://download.csdn.net/detail/baitxaps/8934111

  • 相关阅读:
    算法竞赛入门经典训练指南
    git保护--git分支创建
    解决多个iframe嵌套而造成的多个滚动条问题
    css如何让div元素铺满整个屏幕
    第一个用python3写的爬虫小例子
    用JS获取当前页面的URL以及截取其中的字段
    css处理超出文本截断问题的两种情况(多行或者单行)
    约数的个数
    成绩排序
    八进制
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/7391243.html
Copyright © 2020-2023  润新知