点击UITableView的cell展开收缩(二)

点击组头 展开cell

初始化和加载数据

{
    self.table.tableFooterView = self.footerView;
    [self.table registerClass:[WETableViewCell class] forCellReuseIdentifier:@"WETableViewCell"];
    [self.view addSubview:self.table];
}
- (void)loadData
{
    [[WENetworking shareInstance] ExaminationTypeListsuccess:^(id responseObject) {
     
        NSLog(@"%@",responseObject);
        NSArray *exam_typeArr= responseObject[@"data"][@"exam_type"];
        
        for (NSDictionary *exam_typedic in exam_typeArr) {
            
            
            headerModel *model = [[headerModel alloc] init];
            model.headerTitle = exam_typedic[@"exam_type_name"];
            model.examTypeCode = exam_typedic[@"exam_type_code"];
            ;            NSLog(@"默认%ld个cell",(model.cellsModel.count));

            model.isOpen = NO;
            
            
            [self.firstArr addObject:model];
//            [self.firstArr addObject:exam_typedic[@"exam_type_name"]];
        }
        
        [self.table reloadData];
        
    } failure:^(NSError *error) {
        
    }];

}

自定义表尾 因为项目需求点击创建分类(创建组头)

//  WEFooterView.h

@interface WEFooterView : UIButton

@property (nonatomic,strong) NSString *footerTitle;
@property (nonatomic,copy) void (^footerBlock)(NSString *footerStr);
@end
//
//  WEFooterView.m
//  WisdomEducation

#import "WEFooterView.h"
@interface WEFooterView()
@property(nonatomic, strong) UILabel *titleLab;

@property(nonatomic, strong) UIImageView *addImageView;// 加号

@end
@implementation WEFooterView

- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self addSubviews];
        [self addTarget:self action:@selector(footerClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}
- (void)addSubviews
{
    
    [self addSubview:self.titleLab];
    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.mas_equalTo(10);
        make.centerY.offset(0);
    }];
    
    
    [self addSubview:self.addImageView];
    [self.addImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.offset(-36);
        make.centerY.offset(0);
        make.size.mas_equalTo(CGSizeMake(18, 18));
    }];
}
- (void)footerClick
{
    if (_footerBlock != nil) {
        _footerBlock(_footerTitle);
    }
}
- (void)setFooterTitle:(NSString *)footerTitle
{
    _footerTitle = footerTitle;
    self.titleLab.text = footerTitle;
}
-(UILabel *)titleLab
{
    if (_titleLab == nil) {
        _titleLab = [[UILabel alloc] init];
        _titleLab.text = @"新建一级分类";
        _titleLab.font = [UIFont systemFontOfSize:16];
    }
    return _titleLab;
}
-(UIImageView *)addImageView
{
    if (_addImageView ==nil) {
        _addImageView =[[UIImageView alloc] init];
        _addImageView.image = [UIImage imageNamed:@"加号"];
    }
    return _addImageView;
}
@end

自定义cell

//  WETableViewCell.h

#import <UIKit/UIKit.h>

@interface WETableViewCell : UITableViewCell
@property (nonatomic,strong) NSString *firstCellTitle;

/**
 选中状态
 */
@property (nonatomic,assign) BOOL selectedState;
@property (nonatomic,copy) void (^firstCellBlock)(BOOL selecte);
@property (nonatomic,copy) void (^deleteCellBlock)(void);
@property (nonatomic,copy) void (^editCellBlock)(void);

@end

//
//  WETableViewCell.m

#import "WETableViewCell.h"
@interface WETableViewCell ()
@property(nonatomic, strong) UILabel* titleLab;
@property (nonatomic,strong)UIButton *deldteBtn;
@property (nonatomic, strong)UIButton *editBtn;
/**
 箭头
 */
//@property(nonatomic, strong) UIImageView* indacateImageView;
@end
@implementation WETableViewCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        
        [self addSubViews];
    }
    
    return self;
}
- (void)addSubViews
{
    [self addSubview:self.titleLab];
    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.left.mas_equalTo(25);
        make.centerY.offset(0);

    }];
    
    UIButton *deldteBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [deldteBtn setImage:[UIImage imageNamed:@"删除"] forState:UIControlStateNormal];
    [deldteBtn addTarget:self action:@selector(deleteBtnAction) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:deldteBtn];
    self.deldteBtn = deldteBtn;
    [self.deldteBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        
                make.right.offset(-40);
                make.centerY.offset(0);
                make.size.mas_equalTo(CGSizeMake(14, 14));

    }];
    
    UIButton *editBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [editBtn setImage:[UIImage imageNamed:@"编辑"] forState:UIControlStateNormal];
    [editBtn addTarget:self action:@selector(editBtnAction) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:editBtn];
    
    self.editBtn = editBtn;
    [self.editBtn mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.right.offset(-70);
        make.centerY.offset(0);
        make.size.mas_equalTo(CGSizeMake(14, 14));

        
    }];
}

- (void)setSelectedState:(BOOL)selectedState
{
    _selectedState = selectedState;
    
    if (_firstCellBlock != nil) {
        _firstCellBlock(_selectedState);
        
    }
}
- (void)setFirstCellTitle:(NSString *)firstCellTitle
{
    _firstCellTitle = firstCellTitle;
    self.titleLab.text = firstCellTitle;
    if ([firstCellTitle isEqualToString:@"二级创造"]) {
        [self.deldteBtn setImage:nil forState:UIControlStateNormal];
        [self.editBtn setImage:nil forState:UIControlStateNormal];

    }
}

-(UILabel *)titleLab
{
    if (_titleLab == nil) {
        
        _titleLab = [[UILabel alloc] init];
        _titleLab.font = [UIFont systemFontOfSize:16];

    }
    return _titleLab;
}
- (void)deleteBtnAction
{
    if (_deleteCellBlock != nil) {
        _deleteCellBlock();
    }
}
- (void)editBtnAction
{
    if (_editCellBlock != nil) {
        _editCellBlock();
    }
}
- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

自定义组头

//
//  WEHeaderView.h

#import <UIKit/UIKit.h>
#import "headerModel.h"

@interface WEHeaderView : UIButton
@property (nonatomic,strong) NSString *firstCellTitle;

@property (nonatomic,copy) void (^firstCellBlock)(BOOL selecte);
@property (nonatomic,strong) headerModel *sectionModel;

@end

//
//  WEHeaderView.m
#import "WEHeaderView.h"
@interface WEHeaderView ()
@property(nonatomic, strong) UILabel* titleLab;
/**
 箭头
 */
@property(nonatomic, strong) UIImageView* indacateImageView;

@end
@implementation WEHeaderView


- (instancetype)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
            [self addSubViews];
        [self addTarget:self action:@selector(headerClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return self;
}

- (void)addSubViews
{
    
    UIImageView* leftLine = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"instructions_img_leftLine"]];
    [self addSubview:leftLine];
    [leftLine mas_makeConstraints:^(MASConstraintMaker *make) {
        make.left.offset(10);
        make.centerY.offset(0);
    }];
    
    [self addSubview:self.titleLab];
    [self.titleLab mas_makeConstraints:^(MASConstraintMaker *make) {
        
        make.left.mas_equalTo(18);
        make.centerY.offset(0);
        
    }];
    
    
    [self addSubview:self.indacateImageView];
    [self.indacateImageView mas_makeConstraints:^(MASConstraintMaker *make) {
        make.right.offset(-36);
        make.centerY.offset(0);
        make.size.mas_equalTo(CGSizeMake(14, 9));
    }];
}

- (void)setFirstCellTitle:(NSString *)firstCellTitle
{
    _firstCellTitle = firstCellTitle;
    self.titleLab.text = firstCellTitle;
}
- (void)setSectionModel:(headerModel *)sectionModel
{
    _sectionModel = sectionModel;
    
//    if (!_sectionModel.isOpen) {
//
//        self.indacateImageView.transform = CGAffineTransformIdentity;
//
//    }else{
//
//        self.indacateImageView.transform = CGAffineTransformMakeRotation(M_PI);
//    }
    
            if (self.sectionModel.isOpen) {
                self.indacateImageView.image = [UIImage imageNamed:@"instructions_img_up"];
            } else {
                self.indacateImageView.image = [UIImage imageNamed:@"instructions_img_down"];

            }

}
-(UIImageView *)indacateImageView
{
    if (_indacateImageView == nil) {
        _indacateImageView = [[UIImageView alloc] init];
        _indacateImageView.image = [UIImage imageNamed:@"instructions_img_down"];
        
    }
    return _indacateImageView;
}
-(UILabel *)titleLab
{
    if (_titleLab == nil) {
        
        _titleLab = [[UILabel alloc] init];
        _titleLab.font = [UIFont systemFontOfSize:16];
        
    }
    return _titleLab;
}
#pragma mark _ header 点击
- (void)headerClick {
    
    self.sectionModel.isOpen = !self.sectionModel.isOpen;

    
//    [UIView animateWithDuration:0.25 animations:^{
//
//        if (!self.sectionModel.isOpen) {
//
//            self.indacateImageView.transform = CGAffineTransformIdentity;
//
//        }else{
//
//            self.indacateImageView.transform = CGAffineTransformMakeRotation(M_PI);
//        }
//
//    }];
    
        if (self.sectionModel.isOpen) {
            self.indacateImageView.image = [UIImage imageNamed:@"instructions_img_up"];
        } else {
            self.indacateImageView.image = [UIImage imageNamed:@"instructions_img_down"];

        }
    
    if (_firstCellBlock != nil) {
        _firstCellBlock(self.sectionModel.isOpen);
        
    }
}

@end

cellModel 组头的Model 重点-->组头model用属性数组包含cellModel 用来属性没组多少cell

cell 和组头 上的点击回调

#pragma mark  多少组
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return self.firstArr.count;
}
#pragma mark  每组多少个cell
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
//    return self.senondArr.count;
    NSLog(@"每组有%ld个cell",(self.firstArr[section].cellsModel.count));
    return self.firstArr[section].isOpen ? (self.firstArr[section].cellsModel.count) : 0;
    
}
#pragma mark  cell多高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 44.f;
}
#pragma mark  组头多高
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
    return 44.f;
}
- (UIView* )tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    __weak typeof(self) weakSelf = self;
    
    WEHeaderView* sectionView = [WEHeaderView buttonWithType:UIButtonTypeCustom];
//    sectionView.selectedState = _headerSelectedArr[section];
    
    sectionView.frame = CGRectMake(0, 0, KScreenWidth, 44);
    
    headerModel *headerModel = [self.firstArr safeObjectAtIndex:section];
    sectionView.sectionModel = headerModel;

    sectionView.firstCellTitle = headerModel.headerTitle;
    
    [sectionView setFirstCellBlock:^(BOOL selected) {
        
        [weakSelf setupSelectSecionView:section selectedState:selected];
        
    }];
    
    return  sectionView;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
    return 0.01f;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    WETableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"WETableViewCell" forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    NSArray *cellarr = self.firstArr[indexPath.section].cellsModel;
    cellModel *cellmodel =cellarr[indexPath.row];
    
    cell.firstCellTitle = cellmodel.title;
    
    [cell setDeleteCellBlock:^{
        
        [self deleteCell:cellmodel CellNSIndexPath:indexPath];
    }];
    return cell;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    WETableViewCell *cell = (WETableViewCell *)[tableView cellForRowAtIndexPath:indexPath];
    
    cell.selectedState = !cell.selectedState;

    if ([cell.firstCellTitle isEqualToString:@"二级创造"]) {
        
        [self createAlert:SecondCreateType examTypename:indexPath.section];
    }
    
    
    [cell setFirstCellBlock:^(BOOL selecte) {
        
           NSLog(@"点击了%ld----->%ld",indexPath.row,selecte);
    }];
    
    [cell setEditCellBlock:^{
        
        NSLog(@"编辑----->%ld",indexPath.row);

    }];
}
#pragma mark - 选中哪一个组头 组头回调点击事件
- (void)setupSelectSecionView:(NSInteger)section selectedState:(BOOL)selected  {
    
    
    NSLog(@"第%ld组------>%ld",(long)section,selected);
    
    headerModel *ExamTypeModel = self.firstArr[section];
    NSString *ExamTypeCode = ExamTypeModel.examTypeCode;
    
    if (ExamTypeCode.length > 0) {
        
        [ExamTypeModel.cellsModel removeAllObjects];
        cellModel *model = [[cellModel alloc] init];
        
        model.examSubtypeCode = nil;
        model.title = @"二级创造";
        [ExamTypeModel.cellsModel addObject:model];

        [[WENetworking shareInstance] createSubTypeListExamTypeCode:ExamTypeCode success:^(id responseObject) {
            
            if ([responseObject[@"msg"] isEqualToString:@"ok"]) {
                
                NSArray *subtypes = responseObject[@"data"][@"exam_subtypes"];
                
                for (NSDictionary *subtypedic in subtypes) {
                    
                    cellModel *model = [[cellModel alloc] init];
                    
                    model.examSubtypeCode = subtypedic[@"exam_subtype_code"];
                    model.title = subtypedic[@"exam_subtype_name"];
                    [ExamTypeModel.cellsModel insertObject:model atIndex:0];
                }
            }
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                [self.table reloadSections:[[NSIndexSet alloc] initWithIndex:section] withRowAnimation:UITableViewRowAnimationAutomatic];

            });
            
        } failure:^(NSError *error) {
            
            NSLog(@"查询二级列表错误:%@",error);
        }];
    }

    
}
#pragma mark 删除考试子类
- (void)deleteCell:(cellModel *)cellmode CellNSIndexPath:(NSIndexPath *)indexPath
{
    
    NSString *SubtypeCode = cellmode.examSubtypeCode;
    
    [[WENetworking shareInstance] deleteSubTestName:SubtypeCode success:^(id responseObject) {
        
        if ([responseObject[@"msg"] isEqualToString:@"ok"]) {
            
            dispatch_async(dispatch_get_main_queue(), ^{
                
                [MBProgressHUD showTipMessageInWindow:@"删除成功!" timer:2.0];

                [self setupSelectSecionView:indexPath.section selectedState:YES];

            });

        }
        
    } failure:^(NSError *error) {
        
    }];
    
}
#pragma mark 懒加载
-(UITableView *)table
{
    if (_table == nil) {
        
        _table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, KScreenHeight-64) style:UITableViewStylePlain];
        _table.separatorStyle = UITableViewCellSeparatorStyleNone;
        _table.delegate = self;
        _table.dataSource = self;
        _table.estimatedRowHeight = 0;
    }
    return _table;
}
-(WEFooterView *)footerView
{
    
    __weak typeof(self) weakSelf = self;

    if (_footerView == nil) {
        
        _footerView = [WEFooterView buttonWithType:UIButtonTypeCustom];
        _footerView.frame = CGRectMake(0, 0, KScreenWidth, 44);
        _footerView.footerTitle = @"新建一级分类";
        
        [_footerView setFooterBlock:^(NSString *footerStr) {
            
            NSLog(@"点击了表尾  创建一级分类! 弹框");
      
            [weakSelf createAlert:FirstCreateType examTypename:0];

        }];
    }
    return _footerView;
}
- (void)createAlert:(AlertType)type  examTypename:(NSInteger )type_name
{
    __weak typeof(self) weakSelf = self;

    dispatch_async(dispatch_get_main_queue(), ^{
        
        //                [WEAlertView alerteShowCreateType:FirstCreateType TextFileBlock:nil];
        
        if (!weakSelf.CreateAlertView) {
            
            weakSelf.CreateAlertView = [[FirstCreateView alloc] initWithFrame:CGRectMake(KScreenWidth/2-150, KScreenHeight/2 - 230, 300, 300)];
            weakSelf.CreateAlertView.alertType = type;
            [weakSelf.view addSubview:weakSelf.CreateAlertView];
            
            [weakSelf.CreateAlertView setDismissBlock:^{
                weakSelf.CreateAlertView = nil;
            }];
            
            [weakSelf.CreateAlertView setTextBlock:^(NSString *CreateName) {
                
                NSLog(@"%@",CreateName);
                if (type == FirstCreateType) {
                    
                    [weakSelf CreateFirst:CreateName];
                    
                }else{
                    
                    [weakSelf CreateSecond:CreateName Type_name:type_name];
                }
                
            }];
            
        }
        
        
    });

}
-(NSMutableArray *)firstArr
{
    if (!_firstArr) {
        
        _firstArr = [[NSMutableArray alloc] init];
    }
    return _firstArr;
}
- (NSMutableArray *)senondArr
{
    if (!_senondArr) {
        _senondArr = [[NSMutableArray alloc] init];
    }
    return _senondArr;
}

#pragma mark 创建一级分类
- (void)CreateFirst:(NSString *)firstrName
{
    NSDictionary *dic = @{
                          @"exam_type_name":firstrName,
                          @"short_name":@"TestExamination"
                          };

    [[WENetworking shareInstance] createExaminationType:dic success:^(id responseObject) {
        
        NSLog(@"%@",responseObject);

        NSDictionary *exam_typedic = responseObject[@"data"];
        
        headerModel *model = [[headerModel alloc] init];
        model.headerTitle = exam_typedic[@"exam_type_name"];
        model.examTypeCode = exam_typedic[@"exam_type_code"];

        model.isOpen = NO;
        [self.firstArr addObject:model];
        
        dispatch_async(dispatch_get_main_queue(), ^{
            
       
            [self.table reloadData];
        });
        
    } failure:^(NSError *error) {
        
    }];
    
}


/**
 @param secondName 创造二级类型名称
 @param type_name 所属一级分类名称
 */
- (void)CreateSecond:(NSString *)secondName Type_name:(NSInteger )type_nameIndex
{
    
    
    headerModel *model = self.firstArr[type_nameIndex];

    NSString *type_nameCode = model.examTypeCode;
    
    NSDictionary *dic = @{
                          @"exam_type_code":type_nameCode,
                          @"exam_subtype_name":secondName
                          };

    [[WENetworking shareInstance] createSubExamination:dic success:^(id responseObject) {

        if ([responseObject[@"msg"] isEqualToString:@"ok"]) {
            
            cellModel *secondModel = [[cellModel alloc]init];
            secondModel.title = responseObject[@"data"][@"exam_subtype_name"];
            secondModel.examSubtypeCode = responseObject[@"data"][@"exam_subtype_code"];

            [model.cellsModel insertObject:secondModel atIndex:0];
            
            dispatch_async(dispatch_get_main_queue(), ^{
            
                NSIndexSet *indexSet=[[NSIndexSet alloc]initWithIndex:type_nameIndex];
                
                [self.table reloadSections:indexSet withRowAnimation:UITableViewRowAnimationAutomatic];
            });
            
        }
        
        
    } failure:^(NSError *error) {

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