TableViewCell嵌套TableView實(shí)現(xiàn)評(píng)論列表蓋樓效果

效果




tableView的使用時(shí)需要細(xì)心去優(yōu)化的筷转,我這里就隨便做了一下蔚万,界面目前沒(méi)有卡頓現(xiàn)象零截。

如上圖涧衙,我的界面是ViewController中加了一個(gè)TableView弧哎,tableView分了兩組撤嫩,第一組是顯示的問(wèn)題序攘,第二組顯示評(píng)論两踏,現(xiàn)在實(shí)現(xiàn)的效果:直接點(diǎn)擊最下面回復(fù)則回復(fù)樓主赡麦,點(diǎn)第二組cell上的回復(fù)層主帕识,層主樓層中的回復(fù)不能再被評(píng)論肮疗。

思路:

由于評(píng)論條數(shù),字?jǐn)?shù)未知们衙,所以最外層tableViewcell高度不固定蒙挑,里層tableViewcell高度也不固定愚臀,就需要用Autolayout來(lái)布局姑裂,在這里選擇用Snapkit做欣鳖,在給里面的tableView布局時(shí)必須用 tableView.snp_removeConstraints()清空原來(lái)的約束观堂,否則會(huì)沖突师痕,當(dāng)然也可以用更新約束的方法胰坟,自己嘗試

嵌入的tableViewcell是系統(tǒng)自帶的笔横,最外層tableViewcell定制如下

import UIKit

protocol WenCellStyleTwoDelegate:class {
    func huifuButtonClicked(touser_id:String,answer_id:String)
}
class WenWenDetailTableViewCellStyleTwo: UITableViewCell {

    //屬性
    weak var delegate: WenCellStyleTwoDelegate? = nil
    var headView:WenDetailcellHeadView!
    let titleLabel = UILabel()
    let tableView = UITableView()
    
    //tableViewCell高度數(shù)組
    var cellHeightArray = [CGFloat]()
    
    //數(shù)據(jù)源數(shù)組
    var childArray:NSArray? = nil{
        didSet{
            if childArray == nil {
                return
            }
            //計(jì)算本cell中tableView的cell高度
            cellHeightArray.removeAll()
            for item in childArray! {
                let model = item as! childModel
                let text = "\(model.mobile_phone)回復(fù)\(model.tomobile_phone):\(model.content)"
                let height = ToolManager.calculateStringSize(text, maxW: kScreen_W - 16, maxH: 10000, fontSize: 17).height
                cellHeightArray.append(height+10)
                //                print(cellHeightArray)
            }
            tableView.reloadData()
        }
    }
    
    var model:WenWenCellStyleTwoMode? = nil{
        didSet{
            if model == nil {
                return
            }
            if model?.child != nil {
                childArray = nil
                childArray = model!.child!
            }
            
            let url = NSURL(string: appURL+model!.head_img)
            headView.userHeadImageView.kf_setImageWithURL(url!, placeholderImage: nil)
            headView.userNameLabel.text = ToolManager.stringByX(model!.mobile_phone, startindex: 3, endindex: 7)
            headView.timeLabel.text = model!.timestuts
            
            titleLabel.text = model!.content
            
            setNeedsDisplay()
        }
    }
    
    override func awakeFromNib() {
        super.awakeFromNib()
    }
    
    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
        
        creatUI()
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

}

//MARK: - 界面相關(guān)
extension WenWenDetailTableViewCellStyleTwo{
    
    func creatUI(){
        contentView.backgroundColor = UIColor.whiteColor()
        
        let nib = UINib(nibName: "WenDetailcellHeadView", bundle: nil)
        headView = nib.instantiateWithOwner(self, options: nil).first as! WenDetailcellHeadView
        
        contentView.addSubview(headView)
        contentView.addSubview(titleLabel)
        contentView.addSubview(tableView)
        
        //head
        headView.huifuButton.addTarget(self, action: #selector(WenWenDetailTableViewCellStyleTwo.buttonClicked(_:)), forControlEvents: .TouchUpInside)
        
        //titleLabel
        titleLabel.numberOfLines = 0
        titleLabel.textColor = UIColor.darkGrayColor()
        titleLabel.font = UIFont.systemFontOfSize(17)
        
        //tableView
        tableView.separatorStyle = .None
        tableView.tableFooterView = UIView()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.userInteractionEnabled = false
        
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        if model == nil {
            return
        }
        headView.snp_makeConstraints { (make) in
            make.left.equalTo(self.snp_left)
            make.right.equalTo(self.snp_right)
            make.top.equalTo(self.snp_top)
            make.height.equalTo(70)
        }
        
        titleLabel.snp_makeConstraints { (make) in
            make.left.equalTo(self.snp_left).offset(8)
            make.right.equalTo(self.snp_right).offset(-8)
            make.top.equalTo(headView.snp_bottom)
            make.height.equalTo(ToolManager.calculateStringSize(model!.content, maxW: kScreen_W - 16, maxH: 1000, fontSize: 18).height)
        }
        
        tableView.snp_removeConstraints()
        tableView.snp_makeConstraints { (make) in
            make.left.equalTo(self.snp_left)
            make.right.equalTo(self.snp_right)
            make.top.equalTo(titleLabel.snp_bottom)
            var height:CGFloat = 4
            for item in cellHeightArray {
                height += item
            }
            //                print(height)
            make.height.equalTo(height)
        }
    }
}

//MARK: - 協(xié)議
extension WenWenDetailTableViewCellStyleTwo:UITableViewDelegate,UITableViewDataSource{
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if childArray == nil {
            return 0
        }
        return childArray!.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("cell")
        if cell == nil {
            cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "cell")
        }
        cell?.selectionStyle = .None
        if indexPath.row < childArray!.count {
            cell?.textLabel?.textColor = UIColor.darkGrayColor()
            let model = childArray![indexPath.row] as! childModel
//            print("模型:\(model)")
            let str1 = ToolManager.stringByX(model.mobile_phone, startindex: 3, endindex: 7)
            let str2 = ToolManager.stringByX(model.tomobile_phone, startindex: 3, endindex: 7)
            let attr1 = NSMutableAttributedString(string: "\(str1)回復(fù)\(str2):\(model.content)")
            let attr2 = ToolManager.mixTextColor(attr1, from: 0, to: 11, color: userNameColor) as! NSMutableAttributedString
//            print("字符串:\(attr1)")
            cell?.textLabel?.attributedText = ToolManager.mixTextColor(attr2, from: 13, to: 11, color: userNameColor)
            cell?.textLabel?.numberOfLines = 0
        }
        return cell!
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath.row < cellHeightArray.count {
            return cellHeightArray[indexPath.row]
        }
        return 0
    }
}

//MARK: - 計(jì)算外層(即本身)cell高度
extension WenWenDetailTableViewCellStyleTwo{
    
    func getCellHeightArray(array:NSMutableArray) -> [CGFloat]{
        var cellHArray = [CGFloat]()
        
        for item in array {
            let model = item as! WenWenCellStyleTwoMode
            let h1 = ToolManager.calculateStringSize(model.content, maxW: kScreen_W - 16, maxH: 1000, fontSize: 18).height
            let array2 = model.child
            if array2?.count > 0 {
                var h2:CGFloat = 0
                for comen in array2! {
                    let model2 = comen as! childModel
                    h2 += ToolManager.calculateStringSize("\(model2.mobile_phone)回復(fù)\(model2.tomobile_phone):\(model2.content)", maxW: kScreen_W - 16, maxH: 10000, fontSize: 17).height + 10
                }
                cellHArray.append(h1 + h2 + 84*kScrennScale + 5)
            }else{
                cellHArray.append(h1 + 75)
            }
        }
        return cellHArray
    }
}

//MARK:按鈕點(diǎn)擊
extension WenWenDetailTableViewCellStyleTwo{
    
    func buttonClicked(sender:UIButton){
        print("回復(fù)層主")
        self.delegate?.huifuButtonClicked(model!.user_id, answer_id: model!.id)
    }
}

在最外層tableView中相關(guān)方法

import UIKit
import Alamofire

class WenWenDetailViewController: BasicViewController {
    
    //上一個(gè)界面?zhèn)鬟f問(wèn)題id
    var questionID = ""
    // 數(shù)據(jù)源
    var cellOneModel:WenWenCellStyleOneMode? = nil//第一組
    //第二組
    lazy var dataArray: NSMutableArray = {
       return NSMutableArray()
    }()
    
    //cell高度
    var cellOneHeight:CGFloat = 0 //第一組
    //第二組
    var cellHeightArray = [CGFloat]()
    
    //屬性
    var tableView = UITableView()
    let huifuView = UIView()
    let textView = UITextView()
    
    /// 判斷是回復(fù)還是回答 1:回答 2:回復(fù) 默認(rèn)1
    var type = 1
    
    //存儲(chǔ)回復(fù)層主的id
    var touser_id = ""
    var answer_id = ""
    
    //MARK: 生命周期
    override func viewDidLoad() {
        super.viewDidLoad()
        creatUI()
        navigationSetting()
        getNetData()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(WenWenDetailViewController.keyboardWillAppear(_:)), name:UIKeyboardWillShowNotification, object:nil)
    }
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.navigationBar.translucent = false
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        self.navigationController?.navigationBar.translucent = true
        self.clearAllNotice()
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
    
    deinit{
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }
}

//MARK: 界面相關(guān)
extension WenWenDetailViewController{
    override func creatUI() {
        self.automaticallyAdjustsScrollViewInsets = false
        view.backgroundColor = APSGrayColor
        
        //tableView
        tableView.frame = CGRectMake(0, 0, kScreen_W, kScreen_H - 64 - 70*kScrennScale)
        view.addSubview(tableView)
        tableView.tableFooterView = UIView()
        tableView.delegate = self
        tableView.dataSource = self
        
        //回復(fù)框
        huifuView.frame = CGRectMake(0,kScreen_H - 64 - 70,kScreen_W,70*kScrennScale)
        huifuView.backgroundColor = APSGrayColor
        view.addSubview(huifuView)
        textView.frame = CGRectMake(30, 10*kScrennScale, kScreen_W - 150, 40*kScrennScale)
        textView.layer.masksToBounds = true
        textView.layer.cornerRadius = 3
        textView.delegate = self
        textView.returnKeyType = .Done
        textView.font = UIFont.systemFontOfSize(17)
        huifuView.addSubview(textView)
        let huifuButton = UIButton(frame: CGRectMake(textView.frame.origin.x+textView.frame.width+10,10*kScrennScale,kScreen_W-60-10-textView.frame.width,40*kScrennScale))
        huifuView.addSubview(huifuButton)
        huifuButton.setTitle("回復(fù)", forState: .Normal)
        huifuButton.backgroundColor = APSOrangeColor
        huifuButton.layer.masksToBounds = true
        huifuButton.layer.cornerRadius = 3
        huifuButton.addTarget(self, action: #selector(WenWenDetailViewController.buttonClicked(_:)), forControlEvents: .TouchUpInside)
        
        //注冊(cè)cell
        tableView.registerClass(WenWenDetailTableViewCellStyleOne.self, forCellReuseIdentifier: "cellOne")
        tableView.registerClass(WenWenDetailTableViewCellStyleTwo.self, forCellReuseIdentifier: "cellTwo")
        
    }
    override func navigationSetting() {
        self.navigationItem.title = "問(wèn)題詳情"
        self.navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName:UIColor.blackColor()]
    }
}

//MARK: - tableView協(xié)議
extension WenWenDetailViewController: UITableViewDelegate,UITableViewDataSource{
    
    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 2
    }
    
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if section == 0 {
            return 1
        }
        return dataArray.count
    }
    
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        //第一組
        if indexPath.section == 0{
            let cell = tableView.dequeueReusableCellWithIdentifier("cellOne", forIndexPath: indexPath) as! WenWenDetailTableViewCellStyleOne
            cell.selectionStyle = .None
            cell.model = nil
            if cellOneModel != nil {
                cell.model = cellOneModel
            }
            return cell
        }
        
        //第二組
        let cell = tableView.dequeueReusableCellWithIdentifier("cellTwo", forIndexPath: indexPath) as! WenWenDetailTableViewCellStyleTwo
        cell.selectionStyle = .None
        cell.model = nil
        if indexPath.row < dataArray.count {
            let model = dataArray[indexPath.row] as! WenWenCellStyleTwoMode
            cell.model = nil
            cell.model = model
            cell.delegate = self
        }
        return cell
    }
    
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        if indexPath.section == 0 {
            return cellOneHeight
        }
        //第二組
        if indexPath.row < cellHeightArray.count {
            return cellHeightArray[indexPath.row]
        }
        return 0
    }
    
    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        
    }
}

//MARK: - 網(wǎng)絡(luò)請(qǐng)求
extension WenWenDetailViewController{
    
    func getNetData(){
        pleaseWait()
        Alamofire.request(.GET, getComentsListURL, parameters: ["id":questionID,"user_id":crrentUser!.user_id], encoding: .URL, headers: nil).responseJSON(options: NSJSONReadingOptions.MutableContainers) { (result) in
            self.clearAllNotice()
            if let json = result.result.value{
                let code = json.objectForKey("code")?.stringValue
                if code == "200"{
                    if let data = json.objectForKey("data") as? NSDictionary{
                        self.cellOneModel = WenWenCellStyleOneMode.yy_modelWithDictionary(data as [NSObject : AnyObject])
                        if self.cellOneModel != nil{
                            self.cellOneHeight = WenWenDetailTableViewCellStyleOne().getCellHeight(self.cellOneModel!)
                        }
                        
                        //第二組
                        let child = data["child"]
                        let modelArray = NSArray.yy_modelArrayWithClass(WenWenCellStyleTwoMode.self, json: child!)
                        self.dataArray.removeAllObjects()
                        self.dataArray.addObjectsFromArray(modelArray!)
                        self.cellHeightArray.removeAll()
                        self.cellHeightArray = WenWenDetailTableViewCellStyleTwo().getCellHeightArray(self.dataArray)
                        
                        self.tableView.reloadData()
                    }//data結(jié)束
                }//code結(jié)束
            }//json結(jié)束
        }//Alamofire結(jié)束
    }//函數(shù)結(jié)束
}

//MARK: textViewDelegate
extension WenWenDetailViewController:UITextViewDelegate{
    
    func keyboardWillAppear(notification:NSNotification) {
    
    let userInfo = notification.userInfo![UIKeyboardFrameEndUserInfoKey]
    
    let keyboardY = userInfo!.CGRectValue.size.height

        UIView.animateWithDuration(1) {
            self.huifuView.frame = CGRectMake(0,kScreen_H - 64 - 70 - keyboardY,kScreen_W,70*kScrennScale)
        }
    }
    
    func textViewDidBeginEditing(textView: UITextView) {
        
    }
    
    func textViewDidEndEditing(textView: UITextView) {
        UIView.animateWithDuration(0.2) {
            self.huifuView.frame = CGRectMake(0,kScreen_H - 64 - 70,kScreen_W,70*kScrennScale)
        }
    }
    
    func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool {
        if text.containsString("\n") {
            self.view.endEditing(true)
            return false
        }
        return true
    }
}

//MARK:按鈕點(diǎn)擊事件
extension WenWenDetailViewController:WenCellStyleTwoDelegate{
    
    func buttonClicked(sender:UIButton){
        sender.userInteractionEnabled = false
        print("回復(fù)")
        textView.resignFirstResponder()
        
        //提交
        if textView.text.characters.count == 0 {
            noticeOnlyText("回復(fù)內(nèi)容不能為空", autoClear: true, autoClearTime: 1)
            sender.userInteractionEnabled = true
            return
        }
        
        //回答
        var url = answerURL
        var parameters = ["user_id":crrentUser!.user_id,"id":cellOneModel!.id,"content":textView.text!]
        
        if type == 2 {
            //回復(fù)
            url = huifuURL
            parameters = ["user_id":crrentUser!.user_id,"touser_id":touser_id,"id":cellOneModel!.id,"answer_id":answer_id,"content":textView.text!]
        }
//        print(url)
//        print(parameters)
        Alamofire.request(.GET, url, parameters: parameters, encoding: .URL, headers: nil).responseJSON(options: NSJSONReadingOptions.MutableContainers) { (result) in
            self.type = 1
            sender.userInteractionEnabled = true
            if let json = result.result.value{
                let code = json.objectForKey("code")?.stringValue
//                print(code)
                if code == "200"{
                    self.textView.text = nil
                    self.noticeOnlyText("評(píng)論成功", autoClear: true, autoClearTime: 1)
                    self.performSelector(#selector(WenWenDetailViewController.getNetData), withObject: nil, afterDelay: 1)
                }else{
                    self.noticeOnlyText("參數(shù)錯(cuò)誤", autoClear: true, autoClearTime: 1)
                }
            }else{
                self.noticeOnlyText("服務(wù)器開(kāi)小差啦", autoClear: true, autoClearTime: 1)
            }
        }
    }
    
    func huifuButtonClicked(touser_id:String,answer_id:String){
        //回復(fù)層主
        textView.becomeFirstResponder()
        textView.text = nil
        self.type = 2
        self.answer_id = answer_id
        self.touser_id = touser_id
    }
    
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市喂急,隨后出現(xiàn)的幾起案子格嘁,更是在濱河造成了極大的恐慌,老刑警劉巖廊移,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異懂诗,居然都是意外死亡响禽,警方通過(guò)查閱死者的電腦和手機(jī)芋类,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)界阁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)泡躯,“玉大人贮竟,你說(shuō)我怎么就攤上這事丽焊。” “怎么了咕别?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵技健,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我惰拱,道長(zhǎng)雌贱,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任偿短,我火速辦了婚禮欣孤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昔逗。我一直安慰自己降传,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布勾怒。 她就那樣靜靜地躺著婆排,像睡著了一般。 火紅的嫁衣襯著肌膚如雪控硼。 梳的紋絲不亂的頭發(fā)上泽论,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音卡乾,去河邊找鬼翼悴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛幔妨,可吹牛的內(nèi)容都是我干的鹦赎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼误堡,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼古话!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起锁施,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤陪踩,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后悉抵,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肩狂,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年姥饰,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了傻谁。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡列粪,死狀恐怖审磁,靈堂內(nèi)的尸體忽然破棺而出谈飒,到底是詐尸還是另有隱情,我是刑警寧澤态蒂,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布杭措,位于F島的核電站,受9級(jí)特大地震影響吃媒,放射性物質(zhì)發(fā)生泄漏瓤介。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一赘那、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧氯质,春花似錦募舟、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至辕漂,卻和暖如春呢灶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钉嘹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工鸯乃, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跋涣。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓缨睡,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親陈辱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奖年,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

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