iOS - 评论功能实现

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.reply.count; i++) {
                            MSUCommentModel *commentModel = arrModel.reply[i];
                            NSString *str;
                            if (commentModel.to_user.length > 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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343