博客> iOS - 评论功能实现
iOS - 评论功能实现
2018-04-20 01:54 评论:0 阅读:767 OS_JJ
ios 2 模糊搜索

 473EC3D1187D837EFC648B3A0FED6903.png

前言:偷个懒,这篇文章写起来有些绕,还要修改做好的数据之类的,所以大概只写个思路,代码不用看的太过相信!

零、核心代码和思路

    1. 在控制器创建 commentView,然后复制Model,在commentView.m中 setModel重新初始化,并赋值使用;

    2.评论功能分为 评论tableview 和 回复tableview;    

    3.在重新初始化 setModel set方法中,获取评论条数和model,根据评论内容计算出文本高度,然后重设评论tableview高度;

    4.在评论tableview 的 cellForRowAtIndexPath 方法里,获取回复内容的条数和model,然后根据回复内容计算出文本高度,然后用 cell的方法赋值到回复tableview中,刷新列表,代码:

        1)MSUVideoDetailCommentView中代码
            // 计算回复table 高度
            CGFloat tableViewHeight = 0.0;
            if (arrModel.reply.count > 0) {
                for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                        str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                    }else {
                        str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                    }
                    CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                    tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                }
            } else{
                tableViewHeight = -15;
            }

            // 加上头部视图和底部试图
            [cell configCellWithModel:arrModel tableHeight:tableViewHeight+15];

            cell.lineView.frame = CGRectMake(55, CGRectGetMaxY(cell.commentLab.frame)+5+tableViewHeight+15+10-1, SelfWidth-55-14, 1);

        2) MSUVideoCommentTableCell 中代码

            - (void)configCellWithModel:(MSUArrModel *)model tableHeight:(NSInteger)height{
                self.arrModel = model;

                // 重设 回复table高度
                [_commentTableView remakeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(_commentLab.bottom).offset(5);
                    make.left.equalTo(_commentLab.left).offset(0);
                    make.width.equalTo(CommentTableWidth);
                    make.height.equalTo(height);
                }];

                [self.commentTableView reloadData];
            }

        5. 回复tableview 中 回复内容颜色是富文本设置,代码:

                    if (commentModel.to_user.length > 0) {
                        // 富文本设置
                        NSString *str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                        NSMutableAttributedString *att = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.to_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                        cell.commentLab.attributedText = [MSUStringTools makeAttrubuteKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:att font:10 color:HEXCOLOR(0xf49418)];
                    }else {
                        // 富文本设置
                        NSString *str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                        cell.commentLab.attributedText = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                    }

            6.评论view的整体高度回调,在评论tableview 中的 setModel方法中,遍历 评论条数和model 以及 回复条数和model,计算出内容高度, 然后回调给控制器 中的scrollview 的contentSize,代码:

                MSUVideoDetailCommentView中:

                - (void)setDataModel:(MSUDataDetailModel *)dataModel{
                    _dataModel = dataModel;

                    if (_dataModel.comments.count > 0) {
                        self.titLab.text = [NSString stringWithFormat:@"评论(%ld)",_dataModel.comments.count];
                        self.comeLab.hidden = YES;
                        self.tableView.hidden = NO;
                    } else{
                        self.titLab.text = @"评论";
                        self.tableView.hidden = YES;
                        self.comeLab.hidden = NO;
                    }

                    CGFloat height = 0.0;
                    for (NSInteger i = 0; i < _dataModel.comments.count; i++) {
                        MSUArrModel *arrModel = _dataModel.comments[i];
                        // 计算评论内容高度
                        CGRect rect = [MSUStringTools danamicGetHeightFromText:arrModel.content WithWidth:SelfWidth-65-14 font:11];

                        // 计算回复table高度
                        CGFloat tableViewHeight = 0.0;
                        for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                                str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                            }else {
                                str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                            }
                            CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                            tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                        }

                        // 计算评论table高度
                       height = height + 28 + rect.size.height + 5 + tableViewHeight + 15 + 10;
                    }

                    // 重设评论table高度
                    [_tableView remakeConstraints:^(MASConstraintMaker *make) {
                        make.top.equalTo(self.top).offset(35);
                        make.left.equalTo(self.left).offset(0);
                        make.width.equalTo(SelfWidth);
                        make.height.equalTo(height);
                    }];

                    [self.tableView reloadData];

                    if (self.tableHeightBlock) {
                        self.tableHeightBlock(height);
                    }
                }

            控制器中 : 

                __weak typeof(self) weakSelf = self;
                _comment.tableHeightBlock = ^(NSInteger height) {
                    // 更改滚动视图的滚动面积
                    weakSelf.bgScrollView.contentSize = CGSizeMake(0, 10+self.videoHeight+5+130+height+45);
                    // 更改评论父视图的frame
                    CGRect frame = weakSelf.comment.frame;
                    frame.size.height = 10+self.videoHeight+5+130+height;
                    weakSelf.comment.frame = frame;
                };

一、模型 MSUVideoDetailModel (因为做的是视频、商品,然后下面有评论,所以model内容较多,MSUArrModel和MSUCommentModel是评论的数据结构,其他的可以忽视)

    1.MSUVideoDetailModel.h中的代码

        #import <Foundation>

        @class MSUDataDetailModel;
        @class MSUDetailVideoModel;
        @class MSUDetailGoodsModel;
        @class MSUCommentModel;
        @class MSUArrModel;
        @class MSUSignDetailModel;

        @interface MSUVideoDetailModel : NSObject

        /// 成功码
        @property (nonatomic , assign) NSInteger code;

        /// data
        @property (nonatomic , strong) NSArray<MSUDataDetailModel> *data;

        /// msg
        @property (nonatomic , copy) NSString *msg;

        @end

        @interface MSUDataDetailModel : NSObject

        /// 商品
        @property (nonatomic , strong) NSArray<MSUDetailGoodsModel> *goods;
        /// 动态视频
        @property (nonatomic , strong) NSArray<MSUDetailVideoModel> *video;
        /// 评论
        @property (nonatomic , strong) NSArray<MSUArrModel> *comments;
        /// 自己id
        @property (nonatomic , assign)NSInteger my_id;

        @end

        #pragma makr - 视频
        @interface MSUDetailVideoModel : NSObject

        /// 作者id
        @property (nonatomic , assign) NSInteger _id;

        /// 作者头像
        @property (nonatomic , copy) NSString *author_avatar;

        /// 作者名字
        @property (nonatomic , copy) NSString *author_nickname;

        /// 评论数量
        @property (nonatomic , assign) NSInteger comment_num;

        /// 转发人头像
        @property (nonatomic , copy) NSString *d_avatar;

        /// 转发人名字
        @property (nonatomic , copy) NSString *d_nickname;

        /// 转发人id
        @property (nonatomic , assign) NSInteger d_userid;

        /// 转发人的评论
        @property (nonatomic , copy) NSString *describe;

        /// 动态的id
        @property (nonatomic , assign) NSInteger dynamic_state_id;

        /// 转发数量
        @property (nonatomic , assign) NSInteger forward_num;

        /// 是否关注
        @property (nonatomic , assign) NSInteger is_followed;

        /// 是否收藏
        @property (nonatomic , assign) NSInteger is_collected;

        /// 是否转发
        @property (nonatomic , assign) NSInteger is_relay;

        /// 是否举报
        @property (nonatomic , assign) NSInteger is_tipped;

        /// 经度
        @property (nonatomic , copy) NSString *latitude;

        /// 维度
        @property (nonatomic , copy) NSString *longitude;

        /// 地名
        @property (nonatomic , copy) NSString *place_name;

        /// 点赞数量
        @property (nonatomic , assign) NSInteger upvote;

        /// 是否点赞
        @property (nonatomic , assign) NSInteger is_liked;

        /// 评论内容
        @property (nonatomic , copy) NSString *video_brife;

        /// 视频id
        @property (nonatomic , assign) NSInteger video_id;

        /// 发布时间
        @property (nonatomic , copy) NSString *video_upload_time;

        /// 视频封面图
        @property (nonatomic , copy) NSString *video_img;

        /// 视频点赞人数
        @property (nonatomic , assign) NSInteger video_like;

        /// 视频url
        @property (nonatomic , copy) NSString *video_source_url;

        /// 标签时间
        @property (nonatomic , strong) NSArray<MSUSignDetailModel> *sign;

        @end

        @interface MSUSignDetailModel : NSObject

        @property (nonatomic , copy) NSString *name;

        @property (nonatomic , copy) NSString *time;

        @end

        #pragma mark  - 商品
        @interface MSUDetailGoodsModel : NSObject

        /// 商品id
        @property (nonatomic , copy) NSString *goods_id;

        /// 商品名字
        @property (nonatomic , copy) NSString *goods_name;

        /// 商品图片
        @property (nonatomic , copy) NSString *goods_pic;

        /// 商品价格
        @property (nonatomic , assign) NSString *goods_price;

        /// id
        @property (nonatomic , copy) NSString *_id;

        /// 卖家头像
        @property (nonatomic , copy) NSString *avatar;

        /// 结束时间
        @property (nonatomic , copy) NSString *goods_expire_time;

        /// 开始时间
        @property (nonatomic , copy) NSString *goods_start_time;

        /// 卖家名字
        @property (nonatomic , copy) NSString *nickname;

        /// 推广佣金
        @property (nonatomic , copy) NSString *spread_money;

        /// 购买商品结算佣金
        @property (nonatomic , copy) NSString *video_brokerage;

        /// 是否是推广商品
        @property (nonatomic , assign) NSInteger is_popularize;

        @end

        #pragma makr - 评论
        @interface MSUArrModel : NSObject

        /// 评论id
        @property (nonatomic , copy) NSString *_id;

        /// 评论内容
        @property (nonatomic , copy) NSString *content;

        /// 评论者的头像
        @property (nonatomic , copy) NSString *from_avatar;

        /// 评论者的id
        @property (nonatomic , copy) NSString *from_uid;

        /// 评论者的昵称
        @property (nonatomic , copy) NSString *from_user;

        /// 时间戳
        @property (nonatomic , copy) NSString *time;

        /// 点赞数
        @property (nonatomic , copy) NSString *upvote;

        /// 是否点赞
        @property (nonatomic , assign) NSInteger is_liked;

        /// 是否恢复  1为评论 2为回复
        @property (nonatomic , copy) NSString *topic_type;

        /// 回复
        @property (nonatomic , strong) NSArray<MSUCommentModel> *reply;

        @end

        @interface MSUCommentModel : NSObject

        /// 评论id
        @property (nonatomic , copy) NSString *_id;

        /// 内容
        @property (nonatomic , copy) NSString *content;

        /// 评论者的头像
        @property (nonatomic , copy) NSString *from_avatar;

        /// 评论者的id
        @property (nonatomic , copy) NSString *from_uid;

        /// 评论者的昵称
        @property (nonatomic , copy) NSString *from_user;

        /// 时间戳
        @property (nonatomic , copy) NSString *time;

        /// 被评论者的头像
        @property (nonatomic , copy) NSString *to_avatar;

        /// 被评论的评论id
        @property (nonatomic , copy) NSString *to_comment_id;

        /// 被评论的评论者id
        @property (nonatomic , copy) NSString *to_uid;

        /// 被评论的评论者昵称
        @property (nonatomic , copy) NSString *to_user;

        /// 被评论时,首条评论的id
        @property (nonatomic , copy) NSString *topic_id;

        /// 是否恢复  1为评论 2为回复
        @property (nonatomic , copy) NSString *topic_type;

        /// 点赞数量
        @property (nonatomic , copy) NSString *upvote;

        ///

        @end

    2.MSUVideoDetailModel.m中的代码

        #import "MSUVideoDetailModel.h"

        @implementation MSUVideoDetailModel

        + (NSDictionary *)mj_objectClassInArray{
            return @{@"data":[MSUDataDetailModel class]};
        }

        @end

        @implementation MSUDataDetailModel

        + (NSDictionary *)mj_objectClassInArray{
            return @{@"video":[MSUDetailVideoModel class],
                     @"goods":[MSUDetailGoodsModel class],
                     @"comments":[MSUArrModel class]};
        }

        @end

        #pragma makr - 视频
        @implementation MSUDetailVideoModel

        + (NSDictionary *)mj_objectClassInArray{
            return @{@"sign":[MSUSignDetailModel class]};
        }

        @end

        @implementation MSUSignDetailModel

        @end

        #pragma makr - 商品
        @implementation MSUDetailGoodsModel

        @end

        #pragma makr - 评论
        @implementation MSUCommentModel

        @end

        @implementation MSUArrModel

        + (NSDictionary *)mj_objectClassInArray{
            return @{@"reply":[MSUCommentModel class]};
        }

        @end

二、评论的核心结构就是 tableview 嵌套 tableview ,所以,新建一个View 集成UIView MSUVideoDetailCommentView

1. MSUVideoDetailCommentView.h 中的代码

        #import <UIKit>
        #import "MSUVideoDetailModel.h"

        @protocol MSUVideoDetailCommentViewDelegate <NSObject>

        - (void)pinglunCellDidSelectWithUid:(NSString *)uid commentID:(NSString *)commentID topId:(NSString *)topID;

        @end

        @interface MSUVideoDetailCommentView : UIView

        @property (nonatomic , weak) id<MSUVideoDetailCommentViewDelegate> delegate;

        /// 回调table高度
        @property (nonatomic , copy)void(^tableHeightBlock)(NSInteger height);

        /// 评论标题
        @property (nonatomic , strong) UILabel *titLab;

        /// 内容
        @property (nonatomic , strong) UITableView *tableView;

        /// 无内容视图
        @property (nonatomic , strong) UILabel * comeLab;

        /// 数据
        @property (nonatomic , strong) MSUDataDetailModel *dataModel;

        /// 行高
        @property (nonatomic , assign) CGFloat cellHeight;

        @end

    2. MSUVideoDetailCommentView.m 中的代码 (MSUPathTools.h 是我封装的路径类,MSUStringTools.h是封装的string相关类,在这个地方用以获取文本高度,MSUAFNRequest.h是网络请求类,MSUHUD.h是弹窗类,可根据自己封装类使用)

            #import "MSUVideoDetailCommentView.h"

            #import "UIButton+WebCache.h"
            #import "MSUPathTools.h"
            #import "MSUStringTools.h"
            #import "MSUAFNRequest.h"
            #import "MSUHUD.h"

            #define WIDTH [UIScreen mainScreen].bounds.size.width

            #define SelfWidth [UIScreen mainScreen].bounds.size.width

            //masonry
            #define MAS_SHORTHAND
            #define MAS_SHORTHAND_GLOBALS
            #import "Masonry.h"

            #define HEXCOLOR(rgbValue)      [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

            #import "MSUVideoCommentTableCell.h"

            @interface MSUVideoDetailCommentView ()<UITableViewDelegate>

            @end

            @implementation MSUVideoDetailCommentView

            - (instancetype)initWithFrame:(CGRect)frame
            {
                if (self = [super initWithFrame:frame]) {

                    [self createView];

                }
                return self;
            }

            - (void)setDataModel:(MSUDataDetailModel *)dataModel{
                _dataModel = dataModel;

                if (_dataModel.comments.count > 0) {
                    self.titLab.text = [NSString stringWithFormat:@"评论(%ld)",_dataModel.comments.count];
                    self.comeLab.hidden = YES;
                    self.tableView.hidden = NO;
                } else{
                    self.titLab.text = @"评论";
                    self.tableView.hidden = YES;
                    self.comeLab.hidden = NO;
                }

                CGFloat height = 0.0;
                for (NSInteger i = 0; i < _dataModel.comments.count; i++) {
                    MSUArrModel *arrModel = _dataModel.comments[i];
                    // 计算评论内容高度
                    CGRect rect = [MSUStringTools danamicGetHeightFromText:arrModel.content WithWidth:SelfWidth-65-14 font:11];

                    // 计算回复table高度
                    CGFloat tableViewHeight = 0.0;
                    for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                            str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                        }else {
                            str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                        }
                        CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                        tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                    }

                    // 计算评论table高度
                   height = height + 28 + rect.size.height + 5 + tableViewHeight + 15 + 10;
                }

                // 重设评论table高度
                [_tableView remakeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(self.top).offset(35);
                    make.left.equalTo(self.left).offset(0);
                    make.width.equalTo(SelfWidth);
                    make.height.equalTo(height);
                }];

                [self.tableView reloadData];

                if (self.tableHeightBlock) {
                    self.tableHeightBlock(height);
                }
            }

            - (void)createView{
                UIView *navView = [[UIView alloc] init];
                navView.backgroundColor = [UIColor whiteColor];
                [self addSubview:navView];
                [navView makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(self.top).offset(0);
                    make.left.equalTo(self.left).offset(0);
                    make.width.equalTo(SelfWidth);
                    make.height.equalTo(50);
                }];

                // 标题 评论
                self.titLab = [[UILabel alloc] init];
            //    _titLab.backgroundColor = [UIColor redColor];
                _titLab.font = [UIFont systemFontOfSize:14];
                _titLab.textColor = HEXCOLOR(0x333333);
                [navView addSubview:_titLab];
                [_titLab makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(self.top).offset(15);
                    make.left.equalTo(self.left).offset(14);
                    make.width.equalTo(SelfWidth*0.5);
                    make.height.equalTo(20);
                }];

                // tableview
                self.tableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewStylePlain];
                _tableView.backgroundColor = [UIColor whiteColor];
                _tableView.showsVerticalScrollIndicator = NO;
                _tableView.showsHorizontalScrollIndicator = NO;
                _tableView.scrollEnabled = NO;
            //    _tableView.userInteractionEnabled = NO;
                [self addSubview:_tableView];
                [_tableView registerClass:[MSUVideoCommentTableCell class] forCellReuseIdentifier:@"commentVideoShopCell"];
                self.tableView.delegate = self;
                self.tableView.dataSource = self;
                self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;

                self.comeLab = [[UILabel alloc] init];
                _comeLab.backgroundColor = [UIColor clearColor];
                _comeLab.text = @"快来发表你的评论吧~";
                _comeLab.textAlignment = NSTextAlignmentCenter;
                _comeLab.font = [UIFont systemFontOfSize:11];
                _comeLab.textColor = HEXCOLOR(0xf49418);
                [self addSubview:_comeLab];
                [_comeLab makeConstraints:^(MASConstraintMaker *make) {
                    make.top.equalTo(navView.bottom).offset(10);
                    make.left.equalTo(self.left).offset(0);
                    make.width.equalTo(SelfWidth);
                    make.height.equalTo(20);
                }];
                _comeLab.hidden = YES;
            }

            - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
                return _dataModel.comments.count;
            }

            - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
                // 避免出现cellForRowAtIndexPath中的indexPath.row从4或5开始走,默认设置个初始值
                if (self.cellHeight) {
                    return self.cellHeight;
                } else{
                    return 2;
                }
            }

            - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
                MSUVideoCommentTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"commentVideoShopCell"];
                cell.selectionStyle = UITableViewCellSelectionStyleNone;

                MSUArrModel *arrModel = _dataModel.comments[indexPath.row];

                [cell.iconBtn sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"http://source.showbuy100.com%@",arrModel.from_avatar]] forState:UIControlStateNormal placeholderImage:[MSUPathTools showImageWithContentOfFileByName:@"search-headbig"]];
                cell.nickLab.text = arrModel.from_user;
                cell.commentLab.text = arrModel.content;
                CGRect rect = [MSUStringTools danamicGetHeightFromText:arrModel.content WithWidth:SelfWidth-65-14 font:11];
                cell.commentLab.frame = CGRectMake(55, 28, SelfWidth-55-14, rect.size.height);

                // 评论
                cell.pingBtnClickBlock = ^(UIButton *btn) {
                    if (self.delegate && [self.delegate respondsToSelector:@selector(pinglunCellDidSelectWithUid:commentID:topId:)]) {
                        [self.delegate pinglunCellDidSelectWithUid:arrModel.from_uid commentID:arrModel._id topId:arrModel._id];
                    }
                };

                // 点赞
                if (arrModel.upvote.length > 0 && [arrModel.upvote integerValue] > 0) {
                    cell.likeLab.hidden = NO;
                    cell.likeLab.text = arrModel.upvote;
                    CGSize sizea = [MSUStringTools danamicGetWidthFromText:cell.likeLab.text WithFont:11];
                    cell.likeLab.frame = CGRectMake(SelfWidth-14-15-25, 10, sizea.width, 15);

                    cell.likeBtn.frame = CGRectMake(SelfWidth-14-15-25-sizea.width-15, 10, 15, 15);
                } else{
                    cell.likeLab.hidden = YES;
                    cell.likeBtn.frame = CGRectMake(SelfWidth-14-15-30, 10, 15, 15);
                }

                if (arrModel.is_liked) {
                    [cell.likeBtn setTitle:arrModel.upvote forState:UIControlStateNormal];
                    cell.likeBtn.selected = YES;
                }else{
                    cell.likeBtn.selected = NO;
                    __weak typeof(cell) weakCell = cell;
                    cell.likeBtnClickBlock = ^(UIButton *btn) {
                        btn.selected = YES;
                        weakCell.likeLab.hidden = NO;
                        weakCell.likeLab.text = [NSString stringWithFormat:@"%ld",[arrModel.upvote integerValue]+1];
                        CGSize sizea = [MSUStringTools danamicGetWidthFromText:weakCell.likeLab.text WithFont:11];
                        weakCell.likeLab.frame = CGRectMake(SelfWidth-14-15-25, 10, sizea.width, 15);
                        weakCell.likeBtn.frame = CGRectMake(SelfWidth-14-15-25-sizea.width-15, 10, 15, 15);

                        NSString *token = [[NSUserDefaults standardUserDefaults] objectForKey:@"token"];
                        token = token?token:@"";
                        NSDictionary *dic = @{@"token":token,@"_id":arrModel._id};
                        [[MSUAFNRequest sharedInstance] postRequestWithURL:@"http://api.showbuy100.com/index/comment-up" parameters:dic withBlock:^(id obj, NSError *error) {
                            if (obj) {
                                NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:obj options:NSJSONReadingMutableLeaves error:nil];
                                if (!error) {
                                    NSLog(@"访问成功%@",jsonDict);
                                    btn.userInteractionEnabled = NO;
                                }else{
                                    NSLog(@"访问报错%@",error);
                                }
                            } else{
                                [MSUHUD showFileWithString:@"服务器请求为空"];
                            }

                        }];

                    };
                }

                // 计算回复table 高度
                CGFloat tableViewHeight = 0.0;
                if (arrModel.reply.count > 0) {
                    for (NSInteger i = 0; i < arrModel xss=removed> 0) {
                            str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                        }else {
                            str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                        }
                        CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:str WithWidth:SelfWidth-28-36-5-20 font:10];
                        tableViewHeight = tableViewHeight + comnmentRect.size.height + 5;
                    }
                } else{
                    tableViewHeight = -15;
                }

                // 加上头部视图和底部试图
                [cell configCellWithModel:arrModel tableHeight:tableViewHeight+15];

                cell.lineView.frame = CGRectMake(55, CGRectGetMaxY(cell.commentLab.frame)+5+tableViewHeight+15+10-1, SelfWidth-55-14, 1);

                self.cellHeight = CGRectGetMaxY(cell.lineView.frame);
                cell.delegate = self;

                return cell;
            }

            - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
                MSUArrModel *arrModel = _dataModel.comments[indexPath.row];

                NSLog(@"评论cell");
                if (self.delegate && [self.delegate respondsToSelector:@selector(pinglunCellDidSelectWithUid:commentID:topId:)]) {
                    [self.delegate pinglunCellDidSelectWithUid:arrModel.from_uid commentID:arrModel._id topId:arrModel._id];
                }
            }

            - (void)replyCellDidSelectWithUid:(NSString *)uid commentID:(NSString *)commentID topId:(NSString *)topID{
                if (self.delegate && [self.delegate respondsToSelector:@selector(pinglunCellDidSelectWithUid:commentID:topId:)]) {
                    [self.delegate pinglunCellDidSelectWithUid:uid commentID:commentID topId:topID];
                }
            }

            @end

三、MSUVideoCommentTableCell 内容,回复tableview创建就是在 这个cell里面

    1. MSUVideoCommentTableCell.h 中的代码

        #import <UIKit>
        #import "MSUVideoDetailModel.h"

        @protocol MSUVideoCommentTableCellDelegate <NSObject>

        - (void)replyCellDidSelectWithUid:(NSString *)uid commentID:(NSString *)commentID topId:(NSString *)topID;

        @end

        @interface MSUVideoCommentTableCell : UITableViewCell

        @property (nonatomic , weak) id<MSUVideoCommentTableCellDelegate> delegate;

        /// 点赞按钮回调
        @property (nonatomic , copy) void(^likeBtnClickBlock)(UIButton *btn);
        /// 评论按钮回调
        @property (nonatomic , copy) void(^pingBtnClickBlock)(UIButton *btn);

        /// 头像
        @property (nonatomic , strong) UIButton *iconBtn;

        /// 昵称
        @property (nonatomic , strong) UILabel *nickLab;

        /// 评论
        @property (nonatomic , strong) UIButton *commentBtn;

        /// 点赞
        @property (nonatomic , strong) UIButton *likeBtn;
        @property (nonatomic , strong) UILabel *likeLab;

        /// 内容
        @property (nonatomic , strong) UILabel *commentLab;

        /// 背景线
        @property (nonatomic , strong) UIView *lineView;

        /// 评论列表
        @property (nonatomic , strong) UITableView *commentTableView;

        /// 数据
        @property (nonatomic , strong) MSUArrModel *arrModel;

        /// 行高
        @property (nonatomic , assign) CGFloat cellHeight;

        - (void)configCellWithModel:(MSUArrModel *)model tableHeight:(NSInteger )height;

        @end

    2. MSUVideoCommentTableCell.m 中的代码

        #import "MSUVideoCommentTableCell.h"
        #import "MSUCommentTextTableCell.h"

        #import "MSUStringTools.h"

        //masonry
        #define MAS_SHORTHAND
        #define MAS_SHORTHAND_GLOBALS
        #import "Masonry.h"

        #define SelfWidth [UIScreen mainScreen].bounds.size.width
        #define CommentTableWidth SelfWidth-28-36-5

        #define HEXCOLOR(rgbValue)      [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

        @interface MSUVideoCommentTableCell()<UITableViewDataSource>

        @end

        @implementation MSUVideoCommentTableCell

        - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
            if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
                [self createView];
            }
            return self;
        }

        - (void)createView{
            // 头像
            self.iconBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            _iconBtn.backgroundColor = HEXCOLOR(0xfe4e17);
            _iconBtn.layer.cornerRadius = 18;
            _iconBtn.clipsToBounds = YES;
            _iconBtn.layer.shouldRasterize = YES;
            _iconBtn.layer.rasterizationScale = [UIScreen mainScreen].scale;
            [self addSubview:_iconBtn];
            [_iconBtn makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.top).offset(10);
                make.left.equalTo(self.left).offset(14);
                make.width.equalTo(36);
                make.height.equalTo(36);
            }];

            // 昵称
            self.nickLab = [[UILabel alloc] init];
            _nickLab.font = [UIFont systemFontOfSize:13];
            //    _nickLab.backgroundColor = [UIColor brownColor];
            [self addSubview:_nickLab];
            [_nickLab makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.top).offset(10);
                make.left.equalTo(_iconBtn.right).offset(5);
                make.width.equalTo(SelfWidth * 0.5);
                make.height.equalTo(10);
            }];

            // 评论
            self.commentBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            [_commentBtn setImage:[UIImage imageNamed:@"state-comment"] forState:UIControlStateNormal];
            _commentBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
            [self addSubview:_commentBtn];
            [_commentBtn makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(_nickLab.top).offset(0);
                make.right.equalTo(self.right).offset(-14);
                make.width.equalTo(15);
                make.height.equalTo(15);
            }];
            [_commentBtn addTarget:self action:@selector(commentBtnClick:) forControlEvents:UIControlEventTouchUpInside];

            // 点赞
            self.likeBtn = [UIButton buttonWithType:UIButtonTypeCustom];
            [_likeBtn setImage:[UIImage imageNamed:@"like"] forState:UIControlStateNormal];
            [_likeBtn setImage:[UIImage imageNamed:@"WechatIMG1191"] forState:UIControlStateSelected];
            _likeBtn.imageView.contentMode = UIViewContentModeScaleAspectFit;
            [self addSubview:_likeBtn];
        //    [_likeBtn makeConstraints:^(MASConstraintMaker *make) {
        //        make.top.equalTo(_nickLab.top).offset(0);
        //        make.right.equalTo(_commentBtn.left).offset(-20);
        //        make.width.equalTo(12.5);
        //        make.height.equalTo(12.5);
        //    }];
            [_likeBtn addTarget:self action:@selector(likeBtnClick:) forControlEvents:UIControlEventTouchUpInside];

            // 正文
            self.likeLab = [[UILabel alloc] init];
            [_likeLab setTextColor:HEXCOLOR(0x333333)];
            _likeLab.textAlignment = NSTextAlignmentRight;
            //    _timeLab.backgroundColor = [UIColor redColor];
            _likeLab.font = [UIFont systemFontOfSize:11];
            [self addSubview:_likeLab];
            _likeLab.hidden = YES;

            // 正文
            self.commentLab = [[UILabel alloc] init];
            [_commentLab setTextColor:HEXCOLOR(0x333333)];
            //    _timeLab.backgroundColor = [UIColor redColor];
            _commentLab.font = [UIFont systemFontOfSize:11];
            _commentLab.numberOfLines = 0;
            [self addSubview:_commentLab];

            self.commentTableView = [[UITableView alloc] init];
            _commentTableView.backgroundColor = HEXCOLOR(0xf4f4f4);
            _commentTableView.dataSource = self;
            _commentTableView.delegate = self;
            [self addSubview:_commentTableView];
            _commentTableView.scrollEnabled = NO;
        //    _commentTableView.userInteractionEnabled = NO;
            _commentTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
            [_commentTableView registerClass:[MSUCommentTextTableCell class] forCellReuseIdentifier:@"commentText1Cell"];

            self.lineView = [[UIView alloc] init];
            _lineView.backgroundColor = HEXCOLOR(0xf4f4f4);
            [self addSubview:_lineView];

            UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, CommentTableWidth, 7.5)];
            view.backgroundColor = HEXCOLOR(0xf4f4f4);
            _commentTableView.tableHeaderView = view;
            _commentTableView.tableFooterView = view;

        }

        - (void)configCellWithModel:(MSUArrModel *)model tableHeight:(NSInteger)height{
            self.arrModel = model;

            // 重设 回复table高度
            [_commentTableView remakeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(_commentLab.bottom).offset(5);
                make.left.equalTo(_commentLab.left).offset(0);
                make.width.equalTo(CommentTableWidth);
                make.height.equalTo(height);
            }];

            [self.commentTableView reloadData];
        }

        - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
            return self.arrModel.reply.count;
        }

        - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
            return self.cellHeight;
        }

        - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
            MSUCommentTextTableCell *cell = [tableView dequeueReusableCellWithIdentifier:@"commentText1Cell"];
            cell.backgroundColor = HEXCOLOR(0xf4f4f4);
            cell.selectionStyle = UITableViewCellSelectionStyleNone;

            // 回复内容
            MSUCommentModel *commentModel = self.arrModel.reply[indexPath.row];
            if (commentModel.to_user.length > 0) {
                // 富文本设置
                NSString *str = [NSString stringWithFormat:@"%@ 回复 %@:%@",commentModel.from_user,commentModel.to_user,commentModel.content];;
                NSMutableAttributedString *att = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.to_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
                cell.commentLab.attributedText = [MSUStringTools makeAttrubuteKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:att font:10 color:HEXCOLOR(0xf49418)];
            }else {
                // 富文本设置
                NSString *str = [NSString stringWithFormat:@"%@:%@",commentModel.from_user,commentModel.content];
                cell.commentLab.attributedText = [MSUStringTools makeKeyWordAttributedWithSubText:commentModel.from_user inOrigiText:str font:10 color:HEXCOLOR(0xf49418)];
            }

            // 计算回复内容高
            CGRect comnmentRect = [MSUStringTools danamicGetHeightFromText:cell.commentLab.text WithWidth:CommentTableWidth-20 font:10];
            cell.commentLab.frame = CGRectMake(10, 2.5, CommentTableWidth-20, comnmentRect.size.height);

            // cell高度
            self.cellHeight = comnmentRect.size.height + 5;

            return cell;
        }

        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
            MSUCommentModel *commentModel = self.arrModel.reply[indexPath.row];

            NSLog(@"回复cell");
            if (self.delegate && [self.delegate respondsToSelector:@selector(replyCellDidSelectWithUid:commentID:topId:)]) {
                [self.delegate replyCellDidSelectWithUid:commentModel.from_uid commentID:commentModel._id topId:self.arrModel._id];
            }
        }

        #pragma mark - 点击事件
        - (void)likeBtnClick:(UIButton *)sender{
            if (self.likeBtnClickBlock) {
                self.likeBtnClickBlock(sender);
            }
        }

        - (void)commentBtnClick:(UIButton *)sender{
            if (self.pingBtnClickBlock) {
                self.pingBtnClickBlock(sender);
            }
        }

        @end

四、回复tableview 的 cell ,MSUCommentTextTableCell

    1.MSUCommentTextTableCell.h 中的代码

        #import <UIKit>

        @interface MSUCommentTextTableCell : UITableViewCell

        /// 评论内容
        @property (nonatomic , strong) UILabel *commentLab;

        @end

    2.MSUCommentTextTableCell.m 中的内容

        #import "MSUCommentTextTableCell.h"

        //masonry
        #define MAS_SHORTHAND
        #define MAS_SHORTHAND_GLOBALS
        #import "Masonry.h"

        #define HEXCOLOR(rgbValue)      [UIColor colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 green:((float)((rgbValue & 0xFF00) >> 8))/255.0 blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

        @implementation MSUCommentTextTableCell

        - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier{
            if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
                [self createContentView];
            }
            return self;
        }

        - (void)createContentView{
            UIView *bgView = [[UIView alloc] init];
            [self addSubview:bgView];
            [bgView makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(self.top).offset(0);
                make.left.equalTo(self.left).offset(0);
                make.width.equalTo(self.frame.size.width);
                make.height.equalTo(2.5);
            }];

            self.commentLab = [[UILabel alloc] init];
            _commentLab.font = [UIFont systemFontOfSize:10];
            _commentLab.textColor = HEXCOLOR(0x333333);
            [self addSubview:_commentLab];

            UIView *bg1View = [[UIView alloc] init];
            [self addSubview:bg1View];
            [bg1View makeConstraints:^(MASConstraintMaker *make) {
                make.top.equalTo(_commentLab.bottom).offset(0);
                make.left.equalTo(self.left).offset(0);
                make.width.equalTo(self.frame.size.width);
                make.height.equalTo(2.5);
            }];

        }

        @end
收藏
2
sina weixin mail 回到顶部