舉例說明 歸檔/反歸檔(序列化/反序列化)

本篇文章是對于復(fù)雜對象來說的 這里我們來實(shí)現(xiàn)一個通訊錄的功能 這個通訊錄一共有三個頁面:
(1) 主頁面 顯示名字的tableView
(2) 點(diǎn)擊主頁面中的cell可以跳轉(zhuǎn)到個人詳情頁面(在這個頁面中 可以在textField中修改聯(lián)系人的信息) 修改完信息后 點(diǎn)擊修改完成按鈕 跳轉(zhuǎn)回主頁 這時要將修改完的數(shù)據(jù)也返回到主頁 并在主頁將返回的數(shù)據(jù)添加到數(shù)組中
更新tableView (注意: 這時將數(shù)據(jù)返回主頁就不是簡單的add添加到數(shù)組中就行了 這里要注意插入所修改的數(shù)據(jù)的位置 因?yàn)槲覀兯薷牟灰欢ㄊ悄囊恍衏ell 所以當(dāng)我們在主頁點(diǎn)擊cell跳轉(zhuǎn)到第二頁修改頁的時候 要利用屬性傳值向第二頁傳一個位置的參數(shù) 也就是indexPath.row(做法是 在第二頁的.h文件中設(shè)置一個NSInteger屬性 在tableView的點(diǎn)擊方法中 將indexPath.row賦值給第二頁的NSInteger屬性) 當(dāng)修改完信息后 點(diǎn)擊修改完成 這時要返回主頁 我們要把修改完的數(shù)據(jù)也返回到主頁 我們用到協(xié)議傳值(創(chuàng)建協(xié)議 寫協(xié)議方法 設(shè)置協(xié)議屬性 簽訂協(xié)議 設(shè)置代理人 實(shí)現(xiàn)協(xié)議方法 觸發(fā)協(xié)議 協(xié)議方法應(yīng)該要返回兩個參數(shù)給主頁 (1)對象 也就是將修改完的對象返回到主頁 (2) 位置信息 也就是從主頁傳到第二頁的indexPath 我們還需要將他返回到主頁) 我們通過利用協(xié)議傳值 將修改好的對象和一個位置信息都傳到了主頁 我們在主頁中實(shí)現(xiàn)協(xié)議方法 也就是將返回來的對象添加到主頁數(shù)據(jù)數(shù)組中 由于這是在修改信息 所以要先把修改之前的信息刪除然后再添加這個返回來的修改完的對象 這是我們就要用到我們從主頁傳到第二頁的位置屬性indexPath 我們先刪除 再插入 這是數(shù)組中的信息就已經(jīng)更新完畢了 我們將這個更新完的數(shù)組進(jìn)行歸檔 覆蓋掉之前的舊數(shù)組就可以了)

(3) 在主頁面的navigationBar上創(chuàng)建一個右按鈕 點(diǎn)擊這個按鈕 跳轉(zhuǎn)到第三頁 第三頁的textField都是空的 我們在這里添加新的聯(lián)系人信息 然后點(diǎn)擊第三頁的"添加完成"按鈕 將添加好的信息(也就是對象)返回到主頁 將新添加的信息添加到主頁數(shù)據(jù)數(shù)組中 再將這個數(shù)組歸檔覆蓋掉原來的數(shù)據(jù) 這樣就添加完成了

除了添加聯(lián)系人信息 修改信息 我們還實(shí)現(xiàn)了刪除聯(lián)系人的功能 其實(shí)重要的是要記住無論我們做過了什么操作 只要處理好數(shù)據(jù)源將新的數(shù)據(jù)歸檔 覆蓋掉舊的數(shù)據(jù)就可以實(shí)現(xiàn)相應(yīng)的功能了

下面我們根據(jù)代碼來分析一下

  1. 首先我們還是先傳建一個window 將ViewController設(shè)置為根視圖

     #import "AppDelegate.h"
     #import "ViewController.h"
    
     @interface AppDelegate ()
    
     @end
    
     @implementation AppDelegate
    
     - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
     // Override point for customization after application launch.
     self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
     [self.window makeKeyAndVisible];
     self.window.backgroundColor = [UIColor whiteColor];
     ViewController *vc = [[ViewController alloc] init];
     UINavigationController *nav =   [[UINavigationController alloc] initWithRootViewController:vc];
     self.window.rootViewController = nav;
     return YES;
     }
    
  2. 我們在根視圖控制器中創(chuàng)建tableView
    #import "ViewController.h"
    #define kTableView @"reuse"
    #import "Contact.h"
    #import "ContentViewController.h"
    #import "AddViewController.h"

     @interface ViewController ()   <UITableViewDelegate, UITableViewDataSource,     ContentViewControllerDelegate,   AddViewControllerDelegate>
     @property (nonatomic, strong) UITableView *contactTableView;
     @property (nonatomic, strong) NSMutableArray *dataArray;
     @property (nonatomic, copy) NSString *arrayPath;
    
     @end
    
     @implementation ViewController
    
     - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
               self.navigationController.navigationBar.backgroundColor = [UIColor grayColor];
     self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc]   initWithBarButtonSystemItem:UIBarButtonSystemI      temAdd target:self action:@selector(click:)];
     [self createTableView];
     [self createData];
    
     }
    
     - (void)click:(UIButton *)button {
     // 跳轉(zhuǎn)到添加頁面
     AddViewController *vc = [[AddViewController alloc] init];
     // 在跳轉(zhuǎn)到田間頁面的點(diǎn)擊方法中指定代理人
     vc.delegate = self;
     [self.navigationController pushViewController:vc animated:YES];
     }
    
     - (void)sendAddContact:(Contact *)contact {
     // 在主頁中實(shí)現(xiàn)添加頁面的協(xié)議方法
     // 將從添加頁傳來的新數(shù)據(jù)添加到數(shù)據(jù)數(shù)組中
     [self.dataArray addObject:contact];
     // 刷新tableView
     [self.contactTableView reloadData];
     // 將添加數(shù)據(jù)后的新數(shù)組歸檔本地 覆蓋之前的數(shù)據(jù)
     [NSKeyedArchiver archiveRootObject:self.dataArray   toFile:self.arrayPath];
     }
    
     - (void)createData {
     // 創(chuàng)建沙盒路徑
     NSArray *sandArray =     NSSearchPathForDirectoriesInDomains(NSDocum  entDirectory, NSUserDomainMask, YES);
     NSString *path = [sandArray firstObject];
     // 拼接一個路徑 這個路徑就是我們數(shù)據(jù)的路徑
     self.arrayPath = [path stringByAppendingPathComponent:@"contactPerson.plist"];
     // 我們通過之前的路徑 反歸檔 從本地返回一個數(shù)組
     NSArray *unarchiveArray = [NSKeyedUnarchiver unarchiveObjectWithFile:_arrayPath];
     // 判斷 如果數(shù)組中內(nèi)容不為空 就把這個反歸檔的數(shù)組賦值給我們的數(shù)據(jù)數(shù)組
     if (unarchiveArray.count != 0) {
     self.dataArray = [NSMutableArray arrayWithArray:unarchiveArray];
     }
     else {
     // 如果反歸檔返回的是一個空的數(shù)組我們就向我們的數(shù)據(jù)數(shù)組中添加一個對象(其實(shí)都不需要這個判斷的 我們就直接將反歸檔 返回的數(shù)組直接賦值給我們的數(shù)據(jù)數(shù)組就可以 這里 我們?yōu)榱瞬蛔屩黜撌强瞻椎?就判斷了一下 如果是空的就賦一個初始的對象)
     Contact *contact1 = [[Contact alloc] initWithPicImage:@"fsds" name:@"Eason" phoneNum:@"123456" address:@"香港"];
     self.dataArray = [NSMutableArray array];
     [_dataArray addObject:contact1];
     [NSKeyedArchiver archiveRootObject:_dataArray toFile:_arrayPath];
     }
     NSLog(@"%@", _arrayPath);
     }  
    
     - (void)createTableView {
     self.contactTableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
     self.contactTableView.delegate = self;
     self.contactTableView.dataSource = self;
     [self.view addSubview:self.contactTableView];
     [self.contactTableView registerClass:[UITableViewCell class] forCellReuseIdentifier:kTableView];
     }
    
     // 實(shí)現(xiàn)刪除功能 這是tableView編輯中的內(nèi)容 
     - (void)tableView:(UITableView *)tableView commitEditingStyle:  (UITableViewCellEditingStyle)editingStyle   forRowAtIndexPath:(NSIndexPath *)indexPath {
     // 要想刪除聯(lián)系人 我們要清楚都要刪除哪些內(nèi)容 首先要實(shí)現(xiàn)刪除我們的數(shù)據(jù)數(shù)組相對應(yīng)的對象數(shù)據(jù)然后要刪除對應(yīng)的tableView的cell() 然后就是處理之前本地存儲的數(shù)據(jù)了 我們只需要將更新后的數(shù)據(jù)數(shù)組再次歸檔就可以更新本地數(shù)據(jù)了
     [self.dataArray removeObjectAtIndex:indexPath.row];
     [self.contactTableView deleteRowsAtIndexPaths:@[indexPath]   withRowAnimation:UITableViewRowAnimationFade];
     [NSKeyedArchiver archiveRootObject:self.dataArray toFile:self.arrayPath];
     [self.contactTableView reloadData];
     }
    
     - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
     return self.dataArray.count;
     }
    
     - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kTableView forIndexPath:indexPath];
     cell.textLabel.text = [self.dataArray[indexPath.row] name];
     return cell;
     }
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ContentViewController *vc =     [[ContentViewController alloc] init];
     // 簽訂修改信息的協(xié)議
     vc.delegate = self;
     // 將數(shù)據(jù)所在數(shù)組的下標(biāo)傳值給修改頁面
     vc.index = indexPath.row; 
     vc.contact = self.dataArray[indexPath.row];
     [self.navigationController     pushViewController:vc animated:YES];
     }
     // 實(shí)現(xiàn)修改頁的協(xié)議方法
     - (void)sendContact:(Contact *)contact index:(NSInteger)index {
     // 先移除數(shù)據(jù)數(shù)組中對應(yīng)位置的數(shù)據(jù)
     [self.dataArray removeObjectAtIndex:index];
     // 再將修改后的數(shù)據(jù)插入到數(shù)組中
     [self.dataArray insertObject:contact atIndex:index];
     [self.contactTableView reloadData];
     // 再將更新后的數(shù)組歸檔 覆蓋掉之前的舊數(shù)據(jù)
     [NSKeyedArchiver archiveRootObject:self.dataArray toFile:self.arrayPath];
     }  
    
  3. 添加新聯(lián)系人頁面

     #import <UIKit/UIKit.h>
     #import "Contact.h"
     // 創(chuàng)建協(xié)議 利用協(xié)議實(shí)現(xiàn)將添加頁添加的數(shù)據(jù)傳到主頁面
     @protocol AddViewControllerDelegate <NSObject>
    
     - (void)sendAddContact:(Contact *)contact;
    
    @end
    
    @interface AddViewController :     UIViewController
    @property (nonatomic, strong) Contact *contact;
    @property (nonatomic, weak) id<AddViewControllerDelegate>delegate;
    @end
    
     #import "AddViewController.h"
    
     @interface AddViewController ()
     @property (nonatomic, strong)     UIImageView *picImageView;
     @property (nonatomic, strong) UITextField *nameTextField;
     @property (nonatomic, strong) UITextField *phoneNumTextField;
     @property (nonatomic, strong) UITextField *addressTextField;
    
     @property (nonatomic, strong) UIButton *addButton;
     @end
    
     @implementation AddViewController
    
     - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     self.navigationController.navigationBar.translucent = NO;
     [self createView];
     }
    
     - (void)createView {
     UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, 240, 60, 30)];
     nameLabel.text = @"姓名";
     [self.view addSubview:nameLabel];
     UILabel *phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, 340, 60, 30)];
     phoneLabel.text = @"電話";
     [self.view addSubview:phoneLabel];
     UILabel *addressLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, 290, 60, 30)];
     addressLabel.text = @"地址";
     [self.view addSubview:addressLabel];
    
     self.picImageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 10, 150, 200)];
     self.picImageView.backgroundColor = [UIColor redColor];
     [self.view addSubview:self.picImageView];
    
     self.nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(160, 240, 200, 30)];
     [self.view addSubview:self.nameTextField];
    
     self.addressTextField = [[UITextField alloc] initWithFrame:CGRectMake(160, 290, 200, 30)];
     [self.view addSubview:self.addressTextField];
    
     self.phoneNumTextField = [[UITextField alloc] initWithFrame:CGRectMake(160, 340, 200, 30)];
     [self.view addSubview:self.phoneNumTextField];
    
     self.addButton = [UIButton buttonWithType:UIButtonTypeSystem];
     self.addButton.frame = CGRectMake(80, 390, 90, 30);
     [self.addButton setTitle:@"添加完成" forState:UIControlStateNormal];
     [self.view addSubview:self.addButton];
     [self.addButton addTarget:self action:@selector(addClick:)   forControlEvents:UIControlEventTouchUpInside];
     }
    
     - (void)addClick:(UIButton *)button {
     // 在添加完成的點(diǎn)擊方法中創(chuàng)建一個對象 給對象進(jìn)行賦值
     self.contact = [[Contact alloc] initWithPicImage:@"u=3808451166,1723806820&fm=23&gp=0" name:self.nameTextField.text phoneNum:self.phoneNumTextField.text address:self.addressTextField.text];
     // 這里觸發(fā)協(xié)議方法 將添加的信息傳到主頁
     [self.delegate sendAddContact:self.contact];
     [self.navigationController popToRootViewControllerAnimated:YES];
     }
    
  4. 修改聯(lián)系人信息的頁面

     #import <UIKit/UIKit.h>
     #import "Contact.h"
     // 創(chuàng)建協(xié)議 利用協(xié)議將修改后的數(shù)據(jù)傳到主頁
     @protocol ContentViewControllerDelegate <NSObject>
     // 修改
     - (void)sendContact:(Contact *)contact index:(NSInteger)index;
    
     @end
    
     @interface ContentViewController : UIViewController
     @property (nonatomic, assign) NSInteger index;
     @property (nonatomic, strong) Contact *contact;
     @property (nonatomic, weak) id <ContentViewControllerDelegate>delegate;
     @end
    
     #import "ContentViewController.h"
    
     @interface ContentViewController ()
    
     @property (nonatomic, strong) UIImageView *picImageView;
     @property (nonatomic, strong) UITextField *nameTextField;
     @property (nonatomic, strong) UITextField *phoneNumTextField;
     @property (nonatomic, strong) UITextField *addressTextField;
     @property (nonatomic, strong) UIButton *changeButton;
     @property (nonatomic, strong) NSMutableDictionary *textFieldDic;
     @end
    
     @implementation ContentViewController
    
     - (void)viewDidLoad {
     [super viewDidLoad];
     // Do any additional setup after loading the view.
     self.navigationController.navigationBar.translucent = NO;
     [self createContentView];
    
     }
    
     - (void)createContentView {
     // 創(chuàng)建label
     UILabel *nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, 240, 60, 30)];
     nameLabel.text = @"姓名";
     [self.view addSubview:nameLabel];
     UILabel *phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, 340, 60, 30)];
     phoneLabel.text = @"電話";
     [self.view addSubview:phoneLabel];
     UILabel *addressLabel = [[UILabel alloc] initWithFrame:CGRectMake(80, 290, 60, 30)];
     addressLabel.text = @"地址";
     [self.view addSubview:addressLabel];
    
     self.picImageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 10, 150, 200)];
     self.picImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%@", self.contact.picImage]];
     self.picImageView.backgroundColor = [UIColor redColor];
     [self.view addSubview:self.picImageView];
    
     self.nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(160, 240, 200, 30)];
     self.nameTextField.text = self.contact.name;
     [self.view addSubview:self.nameTextField];
    
     self.addressTextField = [[UITextField alloc] initWithFrame:CGRectMake(160, 290, 200, 30)];
     self.addressTextField.text = self.contact.address;
     [self.view addSubview:self.addressTextField];
    
     self.phoneNumTextField = [[UITextField alloc] initWithFrame:CGRectMake(160, 340, 200, 30)];
     self.phoneNumTextField.text = self.contact.phoneNum;
     [self.view addSubview:self.phoneNumTextField];
    
     self.changeButton = [UIButton buttonWithType:UIButtonTypeSystem];
     self.changeButton.frame = CGRectMake(80, 390, 90, 30);
     [self.changeButton setTitle:@"修改完成" forState:UIControlStateNormal];
     [self.view addSubview:self.changeButton];
     [self.changeButton addTarget:self action:@selector(changeClick:) forControlEvents:UIControlEventTouchUpInside];
    
     }
    
     // 修改信息
     - (void)changeClick:(UIButton *)button {
     self.contact = [[Contact alloc] initWithPicImage:@"u=3808451166,1723806820&fm=23&gp=0.jpg" name:self.nameTextField.text phoneNum:self.phoneNumTextField.text address:self.addressTextField.text];
     [self.delegate sendContact:self.contact index:self.index];
     [self.navigationController popToRootViewControllerAnimated:YES];
     }
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市城舞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丹锹,死亡現(xiàn)場離奇詭異漱抓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伪货,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來珠增,“玉大人超歌,你說我怎么就攤上這事〉俳蹋” “怎么了巍举?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長凝垛。 經(jīng)常有香客問我懊悯,道長蜓谋,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任炭分,我火速辦了婚禮桃焕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捧毛。我一直安慰自己观堂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布呀忧。 她就那樣靜靜地躺著师痕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪而账。 梳的紋絲不亂的頭發(fā)上胰坟,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天,我揣著相機(jī)與錄音泞辐,去河邊找鬼笔横。 笑死,一個胖子當(dāng)著我的面吹牛咐吼,可吹牛的內(nèi)容都是我干的吹缔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼汽烦,長吁一口氣:“原來是場噩夢啊……” “哼涛菠!你這毒婦竟也來了莉御?” 一聲冷哼從身側(cè)響起撇吞,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎礁叔,沒想到半個月后牍颈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡琅关,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年煮岁,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涣易。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡画机,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出新症,到底是詐尸還是另有隱情步氏,我是刑警寧澤,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布徒爹,位于F島的核電站荚醒,受9級特大地震影響芋类,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜界阁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一侯繁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泡躯,春花似錦贮竟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至重付,卻和暖如春顷级,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背确垫。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工弓颈, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人删掀。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓翔冀,卻偏偏與公主長得像,于是被迫代替她去往敵國和親披泪。 傳聞我的和親對象是個殘疾皇子纤子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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

  • 用cocoaPods配置第三方文件 第一步。打開終端 第二步款票。cd+文件夾 第三步控硼。pod init 第四步。打開...
    不說謊的匹諾曹Y閱讀 1,089評論 0 1
  • 作者唯一QQ:228544117艾少。卡乾。。缚够。幔妨。 =========后面的都要新建一個文章 AppDelegate.h ...
    CC_iOS閱讀 873評論 0 0
  • 哦吼吼,又研究了幾天谍椅,把FMDB這個封裝好的數(shù)據(jù)庫搞定了误堡,寫了個簡單的例子,基于FMDB的添刪改查操作雏吭,界面很一般...
    lichengjin閱讀 531評論 0 0
  • 概述在iOS開發(fā)中UITableView可以說是使用最廣泛的控件锁施,我們平時使用的軟件中到處都可以看到它的影子,類似...
    liudhkk閱讀 9,066評論 3 38
  • *7月8日上午 N:Block :跟一個函數(shù)塊差不多,會對里面所有的內(nèi)容的引用計數(shù)+1沾谜,想要解決就用__block...
    炙冰閱讀 2,492評論 1 14