iOS tableView類似攜程/美團(tuán)城市篩選玻褪,自定義sectionIndex

很多app中都需要城市選擇拙徽,最近自己寫了一個(gè)城市篩選、搜索功能,以及tableView雙表聯(lián)動(dòng),上拉自動(dòng)至下一個(gè)分類,tableView的折疊布局膀钠。

Demo -- 傳送門

一掏湾、雙表聯(lián)動(dòng)

1、上拉至下一個(gè)分類

1.gif
  • 給rightTableView添加footRefresh 在刷新回調(diào)的時(shí)候進(jìn)行操作肿嘲,給leftTableView選中至當(dāng)前的下一個(gè)indexPathRow 并同時(shí)將下一個(gè)rightTableView分類的dataSource傳送過去融击,并刷新leftTableView、rightTableView兩個(gè)表雳窟。將leftTableView當(dāng)前選中的indexPath滾動(dòng)到頂部砚嘴。
#pragma mark - rightTableView刷新回調(diào)
- (void)childTableCallback {
    LBWeakSelf(self);
    self.childTableView.freshFinishCallback = ^ {
        LBStrongSelf(self);
        [self setCurrentIndexWithRow:self.currentIndex.row+1];
    };
}
- (void)setCurrentIndexWithRow:(NSInteger)row {
    NSIndexPath *currentIndex = [NSIndexPath indexPathForRow:row inSection:0];
    // 調(diào)用leftTableView的didSelectRowAtIndexPath方法實(shí)現(xiàn)選中下一個(gè)indexPathRow
    [self.baseTableView tableView:self.baseTableView.baseTableView didSelectRowAtIndexPath:currentIndex];
    // 記錄當(dāng)前選中的indexPath
    self.currentIndex = currentIndex;
    [self.baseTableView setValue:self.currentIndex forKey:@"selectedIndex"];
    [self.baseTableView.baseTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:row inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
  • 點(diǎn)擊leftTableView 將當(dāng)前的分類數(shù)據(jù)傳送給rightTableView并刷新rightTableView。
#pragma mark - leftTableView點(diǎn)擊回調(diào)
- (void)baseTableViewCallback {
    LBWeakSelf(self);
    self.baseTableView.didSelectCellCallback = ^(NSIndexPath *indexPath, UITableViewCell *currentBaseCell) {
        LBStrongSelf(self);
        LBModel* model = self.dataSource[indexPath.row];
        // 數(shù)據(jù)源傳給rightTableView
        [self.childTableView setValue:model.cityList forKey:@"childData"];
        // 刷新rightTableView
        [self.childTableView reload];
        self.currentIndex = indexPath;
    };
}

2涩拙、所有區(qū)聯(lián)動(dòng)

2.gif
  • 監(jiān)聽rightTableView滾動(dòng)际长,并獲取當(dāng)前屏幕第一個(gè)section回調(diào)給leftTableView進(jìn)行刷表同時(shí)將當(dāng)前的section滾動(dòng)到頂部
#pragma mark - rightTableView滾動(dòng)監(jiān)聽回調(diào)
- (void)scrollwithIndex:(NSIndexPath *)index {
    self.selectedIndex = index;
    //tableview滾動(dòng)到指定的行:
    [self.baseTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index.row inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];
    [self.baseTableView reloadData];
}

二、tableView折疊

3.gif
  • 定義BOOL值isFlod 記錄是否可以展開兴泥,定義currentIndex記錄當(dāng)前展開的index
// 是否可以展開
@property(nonatomic, assign)BOOL isFlod;
// 當(dāng)前展開的index
@property(nonatomic, assign)NSInteger currentIndex;
  • 給tableViewSection添加UIButton并設(shè)置tag為當(dāng)前section
    sectionBtn.tag = section;
    sectionBtn.selected = self.currentIndex==section&&self.isFlod==YES?YES:NO;
  • Button點(diǎn)擊方法設(shè)置isFlod值和currentIndex值并刷新tableView
- (void)sectionSelect:(UIButton*)sender {
    self.currentIndex = sender.tag;
    sender.selected = !sender.selected;
    self.isFlod = sender.selected;
    [self.foldTableView reloadData];
}
  • 在tableView數(shù)據(jù)源方法中工育,判斷當(dāng)前的section是否為展開狀態(tài)并給出當(dāng)前section有多少row
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.currentIndex == section) {
        LBModel* childModel = self.dataSource[section];
        return self.isFlod==YES?childModel.cityList.count:0;
    }
    return 0;
}

三、城市篩選

4.gif
  • 前面2個(gè)section分別是歷史的篩選和熱門篩選tableViewCell嵌套的collectionView搓彻,后面是按照首字母A~Z的分區(qū)城市的tableViewCell如绸,這個(gè)不多說了,由于我的地址數(shù)據(jù)是按照省市區(qū)分的旭贬,所以自己又重新排了一次數(shù)據(jù)結(jié)構(gòu)怔接。

漢字轉(zhuǎn)拼音

//獲取拼音首字母(傳入漢字字符串, 返回大寫拼音首字母)
+(NSString *)FirstCharactor:(NSString *)pString {
    //轉(zhuǎn)成了可變字符串
    NSMutableString *pStr = [NSMutableString stringWithString:pString];
    //先轉(zhuǎn)換為帶聲調(diào)的拼音
    CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformMandarinLatin,NO);
    //再轉(zhuǎn)換為不帶聲調(diào)的拼音
    CFStringTransform((CFMutableStringRef)pStr,NULL, kCFStringTransformStripDiacritics,NO);
    //多音字處理
    if ([[(NSString *)pString substringToIndex:1] compare:@"長"] == NSOrderedSame) {
        [pStr replaceCharactersInRange:NSMakeRange(0, 5) withString:@"chang"];
    }
    if ([[(NSString *)pString substringToIndex:1] compare:@"沈"] == NSOrderedSame) {
        [pStr replaceCharactersInRange:NSMakeRange(0, 4) withString:@"shen"];
    }
    if ([[(NSString *)pString substringToIndex:1] compare:@"廈"] == NSOrderedSame) {
        [pStr replaceCharactersInRange:NSMakeRange(0, 3) withString:@"xia"];
    }
    if ([[(NSString *)pString substringToIndex:1] compare:@"地"] == NSOrderedSame) {
        [pStr replaceCharactersInRange:NSMakeRange(0, 3) withString:@"di"];
    }
    if ([[(NSString *)pString substringToIndex:1] compare:@"重"] == NSOrderedSame) {
        [pStr replaceCharactersInRange:NSMakeRange(0, 5) withString:@"chong"];
    }
    //轉(zhuǎn)化為大寫拼音    
    NSString *pPinYin = [pStr uppercaseString];  // lowercaseString 轉(zhuǎn)小寫
    /*如果要返回所有的漢字轉(zhuǎn)拼音,直接return pPinYin就可以了稀轨,轉(zhuǎn)完的是中間帶有空格的拼音扼脐,下面是去掉中間空格的方法*/
    /**去空格
    NSString *ciytString = [NSString stringWithFormat:@"%@", pPinYin];
    NSString *cityName = [ciytString stringByReplacingOccurrencesOfString:@" "     withString:@""]; */
    //獲取并返回首字母
    return [pPinYin substringToIndex:1];
}

判斷字符串中是否包含有漢字

// 是否包含漢字
- (BOOL)includeChinese {
    for(int i=0; i< [self length];i++) {
        int a =[self characterAtIndex:i];
        if( a >0x4e00&& a <0x9fff){
            return YES;
        }
    }
    return NO;
}
  • 最上面2個(gè)section的cell點(diǎn)擊回調(diào)
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
    LBCollectionCell * cell = (LBCollectionCell *)[collectionView cellForItemAtIndexPath:indexPath];
    LBCollectionCell * currentCell;
    if (self.index.section==0&&indexPath.row!=0) {
        currentCell = (LBCollectionCell *)[collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    }
    if (self.index.section==1&&indexPath.row!=[self.selectedHotIndex integerValue]) {
        currentCell = (LBCollectionCell *)[collectionView cellForItemAtIndexPath:[NSIndexPath indexPathForRow:[self.selectedHotIndex integerValue] inSection:0]];
    }
    cell.title.backgroundColor = LBUIColorWithRGB(0x3CB371, .5);
    cell.title.textColor = LBUIColorWithRGB(0x228B22, 1);
    currentCell.title.backgroundColor = LBUIColorWithRGB(0xF5F5F5, 1);
    currentCell.title.textColor = LBUIColorWithRGB(0x130202, 1);
    
    if (self.collectionCallback) {
        self.collectionCallback(self.dataArray[indexPath.item],indexPath.item,self.index);
    }
}
#pragma mark - 歷史和熱門cell點(diǎn)擊的回調(diào)--historyAndHotCellCallback
- (void)historyAndHotCellCallback:(LBHistoryCell *)cell {
    LBWeakSelf(self);
    cell.collectionCallback = ^(NSString *selectText,NSInteger collectionSelectIndex,NSIndexPath *index) {
        LBStrongSelf(self);
        if (index.section==1) { // 熱門回調(diào),存入緩存
            [LBUserDefaultTool saveHotSelectedData:collectionSelectIndex];
        } else {                // 歷史回調(diào)
            NSMutableDictionary* dict = self.dataSource[1];
            NSMutableArray* cellArr = dict[@"cityName"];
            // 清熱門選中緩存奋刽,重新存
            [LBUserDefaultTool removeHotSelected];
            // 查找熱門中的數(shù)據(jù)與歷史里選中的數(shù)據(jù)相同
            [cellArr enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
                if ([object isEqualToString:selectText]) {
                    [LBUserDefaultTool saveHotSelectedData:idx];
                }
            }];
        }
        if (self.selectCallback) {
            self.selectCallback(selectText);
        }
    };
}
  • 下面tableViewCell點(diǎn)擊回調(diào)
#pragma mark - tableViewDelegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];
    // 下面tableView點(diǎn)擊
    if (indexPath.section!=0&&indexPath.section!=1) {
        [LBUserDefaultTool removeHotSelected];
        NSMutableDictionary* dict = self.dataSource[indexPath.section];
        NSString* selectText = dict[@"cityName"][indexPath.row];
        if (self.selectCallback) {
            self.selectCallback(selectText);
        }
    }
    // cell選中的標(biāo)記符變化和titleLabel顏色變化
    LBCityCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    LBCityCell *currentCell = [tableView cellForRowAtIndexPath:self.currentSelectedIndex];
    currentCell.cityLabel.textColor = LBUIColorWithRGB(0x130202, 1);
    currentCell.selectedImg.alpha = 0;
    cell.selectedImg.alpha = 1;
    cell.cityLabel.textColor = LBUIColorWithRGB(0x228B22, 1);
}

四瓦侮、城市搜索

搜索.gif
  • UITextField實(shí)時(shí)監(jiān)聽input輸入,input的length大于1佣谐,去遍歷所有數(shù)據(jù)查找肚吏,利用上面漢字轉(zhuǎn)拼音并去空格的方法,與input的數(shù)據(jù)作對比狭魂,如果城市的拼音數(shù)據(jù)包含了input的數(shù)據(jù)罚攀,拼接成model并存入searchArray數(shù)組中作為searchTableView的dataSource展示。
// 搜索input實(shí)時(shí)搜索
- (void)setSearchWithInputText:(NSString *)inputText {
    if (inputText.length > 0) {     // 這里判斷l(xiāng)ength要大于0雌澄,是因?yàn)闈h字轉(zhuǎn)拼音的方法不能傳空值
        [self.searchArray removeAllObjects];
        // length大于1斋泄,進(jìn)行數(shù)據(jù)對比
        if ([NSString transform:inputText].length > 1) {
            // 循環(huán)所有數(shù)據(jù)
            [self.dataSource enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
                NSDictionary* dict = object;
                // firstText A~Z字母
                NSString* firstText = dict[@"cityId"];
                // 輸入的(漢字轉(zhuǎn)拼音)首字母是否屬于A~Z之間 并拼接數(shù)據(jù)存入搜索數(shù)組searchArray中
                if ([[NSString FirstCharactor:inputText] isEqualToString:firstText]) {
                    NSMutableDictionary* tempDict = @{}.mutableCopy;
                    NSMutableArray* tempArr = @[].mutableCopy;
                    tempDict[@"cityId"] = firstText;
                    // 遍歷所有城市的數(shù)組
                    [dict[@"cityName"] enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
                        NSString* cityName = object;
                        // 所有城市的拼音包含輸入的拼音,就是符合的數(shù)據(jù)掷伙,存入搜索的數(shù)組中
                        if ([[NSString transform:cityName] containsString:[NSString transform:inputText]]) {
                            [tempArr addObject:cityName];
                        }
                    }];
                    tempDict[@"cityName"] = tempArr;
                    [self.searchArray addObject:tempDict];
                }
            }];
        }
        self.searchTableView.alpha = [NSString transform:inputText].length>1?1:0;
        [self.searchTableView setValue:self.searchArray forKey:@"dataSource"];
    } else {
        self.searchTableView.alpha = 0;
    }
}

五是己、自定義indexView

5.gif
6.gif
  • 定義一個(gè)indexView又兵,實(shí)現(xiàn)dataSource和delegate方法
@protocol LBIndexViewDataSource <NSObject>
// 返回一共多少個(gè)section
- (NSInteger)numberOfItemViewForSectionIndexView:(LBIndexView *)sectionIndexView;
// 返回每個(gè)section的title
- (NSString *)sectionIndexView:(LBIndexView *)sectionIndexView
               titleForSection:(NSInteger)section;
@end

@protocol LBIndexViewDelegate <NSObject>
// 點(diǎn)擊IndexItemView事件
- (void)sectionIndexView:(LBIndexView *)sectionIndexView
        didSelectSection:(NSInteger)section;
@end

注意:避免delegate方法里section里的row為空任柜,滾動(dòng)到頂部crash卒废,可以進(jìn)行section刪除,我這里沒操作(小伙伴們可以自行操作)

#pragma mark - LBIndexViewDataSource
- (NSInteger)numberOfItemViewForSectionIndexView:(LBIndexView *)sectionIndexView {
    return self.cityTableView.numberOfSections;
}

- (NSString *)sectionIndexView:(LBIndexView *)sectionIndexView titleForSection:(NSInteger)section {
    NSMutableArray* sectionArr = @[].mutableCopy;
    [self.dataSource enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
        NSMutableDictionary* dict = object;
        [sectionArr addObject:dict[@"cityId"]];
    }];
    
    return sectionArr[section];
}
#pragma mark - LBIndexViewDelegate
- (void)sectionIndexView:(LBIndexView *)sectionIndexView didSelectSection:(NSInteger)section {
    NSMutableDictionary* dict = self.dataSource[section];
    NSMutableDictionary* dictionary = self.dataSource.count<=section?self.dataSource[section+1]:@{}.mutableCopy;
    NSMutableArray* arr = [NSMutableArray arrayWithArray:dict[@"cityName"]];
    NSMutableArray* array = [NSMutableArray arrayWithArray:dictionary[@"cityName"]];
    if (arr.count <= 0) {
        section = section+1;
        if (array.count <= 0) {
            section = section+1;
        }
    }
    // 避免section里面的row為空宙地,滾動(dòng)到頂部crash
    [self.cityTableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:section] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}
  • 下面是indexView的幾個(gè)屬性配置
// 是否顯示選中提示圖摔认,默認(rèn)是YES
@property(nonatomic, assign)BOOL isShowCallout;
// 選中提示圖的樣式
@property(nonatomic, assign)NSInteger calloutViewType;
// 選中背景的樣式
@property(nonatomic, assign)NSInteger titleBGViewType;
// 提示圖的主題色
@property(nonatomic, strong)UIColor* schemeColor;
  • 實(shí)現(xiàn)reloadIndeView方法
// 創(chuàng)建數(shù)據(jù)源
- (void)reloadIndexView {
    NSInteger numberOfItems = 0;
    if (_dataSource && [_dataSource respondsToSelector:@selector(numberOfItemViewForSectionIndexView:)]) {
        numberOfItems = [_dataSource numberOfItemViewForSectionIndexView:self];
    }
    for (int i = 0; i < numberOfItems; i++) {
        if (_dataSource && [_dataSource respondsToSelector:@selector(sectionIndexView:titleForSection:)]) {
            LBIndexItemView* itemView = [LBIndexItemView new];
            itemView.section = i;
            itemView.titleLabel.text = [_dataSource sectionIndexView:self titleForSection:i];
            itemView.schemeColor = self.schemeColor?self.schemeColor:LBUIColorWithRGB(0x228B22, 1);
            [self.itemViewList addObject:itemView];
            [self addSubview:itemView];
        }
    }
    [self layoutItemViews];
}
// 布局
- (void)layoutItemViews {
    if (self.itemViewList.count) {
        self.itemViewHeight = LBScreenH/3*2/(CGFloat)(self.itemViewList.count);
    }
    __block CGFloat offsetY = 0.f;
    [self.itemViewList enumerateObjectsUsingBlock:^(id object, NSUInteger idx, BOOL *stop) {
        LBIndexItemView *itemView = object;
        [itemView setHighlighted:NO animated:NO section:idx type:self.titleBGViewType];
        [itemView mas_makeConstraints:^(MASConstraintMaker *make) {
            make.centerX.offset(0);
            make.top.offset(offsetY);
            make.width.mas_equalTo(idx==0||idx==1?LBFit(30):self.itemViewHeight);
            make.height.mas_equalTo(self.itemViewHeight);
        }];
        offsetY += self.itemViewHeight;
    }];
}

分別實(shí)現(xiàn)4個(gè)touch方法,也是indexView的核心

  • touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    self.bgView.hidden = NO;
    UITouch *touch = [touches anyObject];
    // 獲取到touch的point
    CGPoint touchPoint = [touch locationInView:self];
    // 遍歷indexView的數(shù)據(jù)源宅粥,做點(diǎn)擊操作和highlight操作
    for (LBIndexItemView *itemView in self.itemViewList) {
        if (CGRectContainsPoint(itemView.frame, touchPoint)) {
            [self selectItemViewForSection:itemView.section];
            self.highlightedItemIndex = itemView.section;
            return;
        }
    }
    self.highlightedItemIndex = -1;
}
  • touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    self.bgView.hidden = NO;
    UITouch *touch = [touches anyObject];
    CGPoint touchPoint = [touch locationInView:self];
    
    for (LBIndexItemView *itemView in self.itemViewList) {
        if (CGRectContainsPoint(itemView.frame, touchPoint)) {
            if (itemView.section != self.highlightedItemIndex) {
                [self selectItemViewForSection:itemView.section];
                self.highlightedItemIndex = itemView.section;
                return;
            }
        }
    }
}
  • touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    self.bgView.hidden = YES;
    // 取消所有higlight的item
    [self unhighlightAllItems];
    self.highlightedItemIndex = -1;
}
  • touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [self touchesCancelled:touches withEvent:event];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末参袱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子秽梅,更是在濱河造成了極大的恐慌抹蚀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件企垦,死亡現(xiàn)場離奇詭異环壤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)钞诡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進(jìn)店門郑现,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人荧降,你說我怎么就攤上這事接箫。” “怎么了朵诫?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵辛友,是天一觀的道長。 經(jīng)常有香客問我剪返,道長瞎领,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任随夸,我火速辦了婚禮九默,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宾毒。我一直安慰自己驼修,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布诈铛。 她就那樣靜靜地躺著乙各,像睡著了一般。 火紅的嫁衣襯著肌膚如雪幢竹。 梳的紋絲不亂的頭發(fā)上耳峦,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天,我揣著相機(jī)與錄音焕毫,去河邊找鬼蹲坷。 笑死驶乾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的循签。 我是一名探鬼主播级乐,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼县匠!你這毒婦竟也來了风科?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤乞旦,失蹤者是張志新(化名)和其女友劉穎贼穆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兰粉,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扮惦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了亲桦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崖蜜。...
    茶點(diǎn)故事閱讀 38,622評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖客峭,靈堂內(nèi)的尸體忽然破棺而出豫领,到底是詐尸還是另有隱情,我是刑警寧澤舔琅,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布等恐,位于F島的核電站,受9級特大地震影響备蚓,放射性物質(zhì)發(fā)生泄漏课蔬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一郊尝、第九天 我趴在偏房一處隱蔽的房頂上張望二跋。 院中可真熱鬧,春花似錦流昏、人聲如沸扎即。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谚鄙。三九已至,卻和暖如春刁绒,著一層夾襖步出監(jiān)牢的瞬間闷营,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工知市, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傻盟,地道東北人速蕊。 一個(gè)月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像莫杈,于是被迫代替她去往敵國和親互例。 傳聞我的和親對象是個(gè)殘疾皇子奢入,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內(nèi)容