UIAlertController的使用

當(dāng)你的應(yīng)用程序需要向用戶(hù)呈現(xiàn)重要信息恢恼,或提示用戶(hù)重要選擇時(shí)末秃,可以使用警告框(Alert View)和操作表(Action Sheet)。下圖左側(cè)部分是警告框血筑,右側(cè)部分是操作表害幅。

Alert&ActionSheet.png

自iOS 8開(kāi)始消恍,Apple用繼承自UIViewControllerUIAlertController取代了UIAlertViewUIAlertSheet

警報(bào)控制器(UIAlertController)雖然有警告框和操作表兩種形式以现,但其創(chuàng)建步驟是一樣的狠怨。如下所示:

  1. 創(chuàng)建UIAlertController,指定警報(bào)控制器樣式邑遏。
  2. 向警報(bào)控制器添加按鈕取董。
  3. 顯示UIAlertController

1. 創(chuàng)建demo

下面通過(guò)demo來(lái)學(xué)習(xí)一下无宿。

打開(kāi)Xcode,點(diǎn)擊File > New > Project…枢里,選擇iOS > Application > Single View Application模板孽鸡,點(diǎn)擊Next;在Product Name中填寫(xiě)AlertController栏豺,點(diǎn)擊Next彬碱;選擇文件,點(diǎn)擊Create創(chuàng)建工程奥洼。

打開(kāi)剛創(chuàng)建工程的storyboard巷疼,在storyboard中自上而下依次添加以下控件,內(nèi)容為UIAlertControllerStyleAlertUILabel灵奖,名稱(chēng)為Show AlertUIButton嚼沿,名稱(chēng)為Login AlertUIButton估盘,內(nèi)容為UIAlertControllerStyleActionSheetUILabel,名稱(chēng)為Action SheetUIButton骡尽。如下圖:

AlertControllerStoryboard.png

UIButton拖拽到ViewController.m的接口部分遣妥,類(lèi)型為IBAction。完成后代碼如下:

#import "ViewController.h"

@interface ViewController ()

- (IBAction)showAlertView:(UIButton *)sender;
- (IBAction)showLoginAlertView:(UIButton *)sender;
- (IBAction)showActionSheet:(UIButton *)sender;

@end

2. 簡(jiǎn)單對(duì)話(huà)框樣式

2.1 創(chuàng)建警報(bào)控制器

創(chuàng)建UIAlertController非常簡(jiǎn)單攀细,不需要設(shè)置代理箫踩、不需要指定按鈕。

下面先在showAlertView:方法中谭贪,創(chuàng)建UIAlertController境钟。

- (IBAction)showAlertView:(UIButton *)sender
{
    // 1.創(chuàng)建UIAlertController
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert Title"
                                                                             message:@"The message is ..."
                                                                      preferredStyle:UIAlertControllerStyleAlert];
}

這里的preferredStyle:參數(shù)有UIAlertControllerStyleAlertUIAlertControllerStyleActionSheet兩種,這里我們要?jiǎng)?chuàng)建的是Alert View俭识,所以使用第一種慨削。

2.2 添加按鈕

使用actionWithTitle: style: handler:方法創(chuàng)建UIAlertAction對(duì)象,之后把對(duì)象添加到警報(bào)控制器鱼的。

UIAlertAction對(duì)象由標(biāo)題理盆、樣式和用戶(hù)單擊該按鈕時(shí)運(yùn)行的代碼塊三部分組成。UIAlertActionStyle有三種樣式凑阶,樣式一UIAlertActionStyleCancel猿规,用于取消操作、不作任何修改宙橱,就是常見(jiàn)的取消按鈕姨俩;樣式二UIAlertActionStyleDefault,按鈕的默認(rèn)樣式师郑;第三種是UIAlertActionStyleDestructive环葵,用于對(duì)數(shù)據(jù)進(jìn)行更改或刪除的操作,這種樣式的按鈕標(biāo)題會(huì)自動(dòng)使用紅色顯示宝冕。

showAlertView:方法中添加Cancel按鈕和OK按鈕张遭。

- (IBAction)showAlertView:(UIButton *)sender
{
    ...
    // 2.創(chuàng)建并添加按鈕
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"OK Action");
    }];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"Cancel Action");
    }];

    [alertController addAction:okAction];           // A
    [alertController addAction:cancelAction];       // B
}

2.3 顯示UIAlertController

顯示UIAlertController

- (IBAction)showAlertView:(UIButton *)sender
{
    ...
    // 3.呈現(xiàn)UIAlertContorller
    [self presentViewController:alertController animated:YES completion:nil];
}

點(diǎn)擊Show Alert按鈕地梨,視圖控制器顯示如下:

AlertControllerAlertDefault.png

改變上面addAction:方法順序菊卷,運(yùn)行app,你會(huì)發(fā)現(xiàn)Alert View中按鈕順序不變宝剖。當(dāng)Alert View樣式中有Cancel按鈕時(shí)洁闰,Cancel按鈕總是顯示在左側(cè),與添加按鈕的順序無(wú)關(guān)万细。

showAlertView:方法中再添加一個(gè)UIAlertActionStyleDestructive樣式的Reset按鈕扑眉。

- (IBAction)showAlertView:(UIButton *)sender
{
    ...
    UIAlertAction *resetAction = [UIAlertAction actionWithTitle:@"Reset" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"Reset Action");
    }];
    [alertController addAction:resetAction];        // C
    [alertController addAction:okAction];           // A
    [alertController addAction:cancelAction];       // B
    ...
}

運(yùn)行demo,顯示如下:

AlertControllerDestructive.png

當(dāng)Alert View中存在一個(gè)或兩個(gè)按鈕時(shí),按鈕會(huì)水平排布腰素;按鈕大于兩個(gè)時(shí)會(huì)像Action Sheet那樣豎列展示聘裁。把上面addAction:方法順序改變?yōu)锽、A耸弄、C咧虎,運(yùn)行app,視圖控制器顯示如下:

AlertBAC.png

可以看到只要上面有UIAlertActionStyleCancel樣式的按鈕计呈,該按鈕總是在最底部砰诵,其他按鈕順序由添加順序決定。如果包含UIAlertActionStyleDestructive樣式的按鈕捌显,一般先添加茁彭,以便在第一個(gè)位置顯示。每一個(gè)警報(bào)控制器只能包含一個(gè)Cancel按鈕扶歪,如果你添加了兩個(gè)或多個(gè)理肺,在運(yùn)行時(shí)會(huì)拋出NSInternalInconsistencyException的異常。

3. 登錄文本框

UIAlerController的另一個(gè)用途是我們可以向警報(bào)控制器中添加任意數(shù)量的UITextField作為警報(bào)控制器內(nèi)容視圖中的一部分善镰。比如常見(jiàn)的登陸框妹萨。

AlertControllerLoginDemo.png

為創(chuàng)建一個(gè)如上圖的登錄框,我們需要為警報(bào)控制器添加兩個(gè)文本框炫欺。每一個(gè)文本框添加合適的占位符以提示需要輸入文本信息類(lèi)型乎完,并為需要輸入密碼的文本框啟用安全文本,以確保密碼安全品洛。更新后的showLoginAlertView:代碼如下:

- (IBAction)showLoginAlertView:(UIButton *)sender
{
    // 1.創(chuàng)建UIAlertController
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Login"
                                                                             message:@"Enter Your Account Info Below"
                                                                      preferredStyle:UIAlertControllerStyleAlert];
    
    // 2.1 添加文本框
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = @"username";
    }];
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = @"password";
        textField.secureTextEntry = YES;
    }];
}

繼續(xù)在showLoginAlertView:方法中添加Cancel按鈕和Login按鈕树姨,在點(diǎn)擊Login按鈕時(shí)獲取文本框中的賬號(hào)和密碼并輸出到控制臺(tái)。

- (IBAction)showLoginAlertView:(UIButton *)sender
{
    ...
    // 2.2  創(chuàng)建Cancel Login按鈕
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"Cancel Action");
    }];
    UIAlertAction *loginAction = [UIAlertAction actionWithTitle:@"Login" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        UITextField *userName = alertController.textFields.firstObject;
        UITextField *password = alertController.textFields.lastObject;
        
        // 輸出用戶(hù)名 密碼到控制臺(tái)
        NSLog(@"username is %@, password is %@",userName.text,password.text);
    }];
}

上面的代碼中桥状,UIAlertController內(nèi)textFields 數(shù)組內(nèi)元素順序和添加順序一致帽揪。

最后添加按鈕,顯示警報(bào)控制器辅斟。

- (IBAction)showLoginAlertView:(UIButton *)sender
{
    ...
    // 2.3 添加按鈕
    [alertController addAction:cancelAction];
    [alertController addAction:loginAction];
    
    // 3.顯示警報(bào)控制器
    [self presentViewController:alertController animated:YES completion:nil];
}

現(xiàn)在運(yùn)行app转晰,在第一個(gè)文本框中輸入pro648,在第二個(gè)文本框內(nèi)輸入x士飒,點(diǎn)擊Login按鈕查邢,控制臺(tái)輸出如下:

username is pro648, password is x

在實(shí)際應(yīng)用中我們一般會(huì)對(duì)用戶(hù)名和密碼長(zhǎng)度進(jìn)行限制,當(dāng)長(zhǎng)度不足時(shí)應(yīng)該禁用Login按鈕变汪。我們可以通過(guò)為文本框添加一個(gè)UIControllEventEditingChanged響應(yīng)事件來(lái)實(shí)現(xiàn)。記得在添加按鈕前先禁用按鈕蚁趁。更新后代碼如下:

- (IBAction)showLoginAlertView:(UIButton *)sender
{
    ...
    // 2.1 添加文本框
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = @"username";
        
        [textField addTarget:self action:@selector(alertUserAccountInfoDidChange:) forControlEvents:UIControlEventEditingChanged];     // 添加響應(yīng)事件
    }];
    [alertController addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) {
        textField.placeholder = @"password";
        textField.secureTextEntry = YES;
        
        [textField addTarget:self action:@selector(alertUserAccountInfoDidChange:) forControlEvents:UIControlEventEditingChanged];     // 添加響應(yīng)事件
    }];
    
    ...
    // 2.3 添加按鈕
    loginAction.enabled = NO;   // 禁用Login按鈕
    [alertController addAction:cancelAction];
    [alertController addAction:loginAction];
    ...
}

- (void)alertUserAccountInfoDidChange:(UITextField *)sender
{
    UIAlertController *alertController = (UIAlertController *)self.presentedViewController;
    
    if (alertController)
    {
        NSString *userName = alertController.textFields.firstObject.text;
        NSString *password = alertController.textFields.lastObject.text;
        UIAlertAction *loginAction = alertController.actions.lastObject;
        
        if (userName.length > 3 && password.length > 6)
            // 用戶(hù)名大于3位裙盾,密碼大于6位時(shí),啟用Login按鈕。
            loginAction.enabled = YES;
        else
            // 用戶(hù)名小于等于3位番官,密碼小于等于6位庐完,禁用Login按鈕。
            loginAction.enabled = NO;
    }
}

UIAlertController中的textFieldsactions均是數(shù)組類(lèi)型徘熔,添加的第一個(gè)對(duì)象index為0门躯。之后按照添加的順序index依次加1,雖然前面說(shuō)到Cancel按鈕一般顯示在左側(cè)(橫排)或底部(豎排)酷师,但并不代表它在數(shù)組中的位置是第一個(gè)或最后一個(gè)讶凉,其index是由添加的順序決定。你可以根據(jù)username字符串長(zhǎng)度來(lái)禁用Login按鈕進(jìn)行測(cè)試山孔。

現(xiàn)在只有在用戶(hù)名大于三位懂讯、密碼大于六位時(shí),Login按鈕才可以點(diǎn)擊台颠。

AlertControllerLoginA.png

AlertControllerLoginB.png

4. 操作表Action Sheet

操作表一般用于為用戶(hù)提供一組可供選擇的操作選項(xiàng)褐望,如刪除、恢復(fù)等串前。一般根據(jù)設(shè)備尺寸大小決定呈現(xiàn)形式瘫里,在iPhone上,操作表由底部滑出荡碾;在iPad上谨读,操作表以彈出框(popover)形式出現(xiàn)。

創(chuàng)建操作表的方法與警告框類(lèi)似玩荠,唯一不同在于preferredStyle:參數(shù)的選擇漆腌。在showActionSheet:方法中創(chuàng)建操作表。

- (IBAction)showActionSheet:(UIButton *)sender
{
    // 1.創(chuàng)建UIAlertController
    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Action Sheet"
                                                                             message:@"Deleted data can't be restored"
                                                                      preferredStyle:UIAlertControllerStyleActionSheet];
}

下面創(chuàng)建并添加按鈕阶冈,最后呈現(xiàn)警報(bào)控制器闷尿。

- (IBAction)showActionSheet:(UIButton *)sender
{
    ...
    // 2.1 創(chuàng)建按鈕
    UIAlertAction *deleteAction = [UIAlertAction actionWithTitle:@"Delete" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"Delete Action");
    }];
    UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        NSLog(@"Cancel Action");
    }];
    
    // 2.2 添加按鈕
    [alertController addAction:deleteAction];
    [alertController addAction:cancelAction];
    
    // 3.顯示警報(bào)控制器
    [self presentViewController:alertController animated:YES completion:nil];
}

運(yùn)行app,操作表展示如下:

AlertControllerActionSheetiPhone.png

如果Action Sheet中有取消按鈕女坑,取消按鈕每次都會(huì)在底部顯示填具,其他按鈕會(huì)按照添加的順序顯示。在Action Sheet內(nèi)不能添加文本框匆骗。如果你添加了文本框劳景,在運(yùn)行時(shí)會(huì)拋出下面的異常提醒:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Text fields can only be added to an alert controller of style UIAlertControllerStyleAlert'

如上面說(shuō)到的,在iPad中Action Sheet以彈出框的形式呈現(xiàn)碉就。彈出框總是需要一個(gè)錨點(diǎn)盟广,錨點(diǎn)可以是源視圖,也可以是按鈕瓮钥。在這個(gè)demo中筋量,我們用按鈕觸發(fā)彈出框烹吵,所以這里將把按鈕作為錨點(diǎn)。showActionSheet:方法更新后如下:

- (IBAction)showActionSheet:(UIButton *)sender
{
    ...
    UIPopoverPresentationController *popover = alertController.popoverPresentationController;
    if (popover)
    {
        popover.sourceView = sender;
        popover.sourceRect = sender.bounds;
        popover.permittedArrowDirections = UIPopoverArrowDirectionAny;
    }
    
    // 3.顯示警報(bào)控制器
    [self presentViewController:alertController animated:YES completion:nil];
}

如果在iPad中沒(méi)有添加上面方法桨武,運(yùn)行時(shí)會(huì)出現(xiàn)下面崩潰提示:

*** Terminating app due to uncaught exception 'NSGenericException', reason: 'Your application has presented a UIAlertController (<UIAlertController: 0x7f88c85221f0>) of style UIAlertControllerStyleActionSheet. The modalPresentationStyle of a UIAlertController with this style is UIModalPresentationPopover. You must provide location information for this popover through the alert controller's popoverPresentationController. You must provide either a sourceView and sourceRect or a barButtonItem. If this information is not known when you present the alert controller, you may provide it in the UIPopoverPresentationControllerDelegate method -prepareForPopoverPresentation.'

現(xiàn)在肋拔,Action Sheet以觸發(fā)它的按鈕為錨點(diǎn),以彈出框形式展現(xiàn)呀酸。

AlertControllerActionSheetiPad.png

當(dāng)Action Sheet以彈出框形式展現(xiàn)時(shí)凉蜂,UIKit會(huì)取消顯示Cancel按鈕。此時(shí)性誉,點(diǎn)擊popover以外任何區(qū)域和點(diǎn)擊Cancel按鈕效果一致窿吩,同時(shí)會(huì)調(diào)用取消按鈕的完成處理程序。

5. 退出警報(bào)控制器

警報(bào)控制器會(huì)在用戶(hù)點(diǎn)擊按鈕后自動(dòng)消失艾栋,但在app進(jìn)入后臺(tái)時(shí)爆存,警告框和選擇表并不會(huì)自動(dòng)退出。此時(shí)蝗砾,我們需要通過(guò)代碼實(shí)現(xiàn)退出警報(bào)控制器先较。

通知中心進(jìn)行注冊(cè),當(dāng)接收到app進(jìn)入后臺(tái)的通知時(shí)退出警報(bào)控制器悼粮。更新后的viewDidLoad如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    // app 進(jìn)入后臺(tái)后隱藏警報(bào)控制器
    [[NSNotificationCenter defaultCenter] addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {
        [self.presentedViewController dismissViewControllerAnimated:YES completion:nil];
    }];
}

- (void)dealloc
{
    // 移除觀察者
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:nil];
}

最后一定記得移除觀察者闲勺,否則會(huì)引起崩潰。

總結(jié)

下面總結(jié)下Alert View和Action Sheet的異同扣猫。

警告框Alert View:

  • 一般顯示在當(dāng)前視圖控制器的中心菜循,點(diǎn)擊警告框以外區(qū)域不能隱藏警告控制器。
  • 可以添加任意數(shù)量文本框申尤。
  • 有一個(gè)或兩個(gè)按鈕時(shí)癌幕,橫向排布,如果有Cancel按鈕昧穿,則Cancel按鈕顯示在左側(cè)勺远;有兩個(gè)以上按鈕時(shí),豎列排布时鸵,如果有Cancel按鈕胶逢,則Cancel按鈕顯示在最底部。其他按鈕按照添加順序排布饰潜。

操作表Action Sheet:

  • 在iPhone中自下而上滑出顯示在當(dāng)前控制器的底部初坠,點(diǎn)擊action sheet以外區(qū)域可以隱藏UIAlertController
  • 在iPad中以popover方式彭雾、以源視圖為錨點(diǎn)顯示碟刺,點(diǎn)擊選擇表以外的區(qū)域可以隱藏警告控制器。
  • 不能添加文本框薯酝。
  • 按鈕豎列排布半沽,在iPhone中身诺,Cancel按鈕默認(rèn)在底部顯示;在iPad中抄囚,Cancel按鈕默認(rèn)不顯示。

UIAlertController類(lèi)只能原樣使用橄务,不支持子類(lèi)化幔托。該類(lèi)的視圖層次結(jié)構(gòu)是私有的,不能修改蜂挪。最后重挑,需要注意的是,警告框和操作表向用戶(hù)顯示信息時(shí)會(huì)中斷應(yīng)用的當(dāng)前流程棠涮,請(qǐng)只在需要的時(shí)候使用谬哀,切勿濫用。

Demo名稱(chēng):AlertController
源碼地址:https://github.com/pro648/BasicDemos-iOS

參考資料:

  1. UIAlertController Changes in iOS 8
  2. UIAlertController

歡迎更多指正:https://github.com/pro648/tips/wiki

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末严肪,一起剝皮案震驚了整個(gè)濱河市史煎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌驳糯,老刑警劉巖篇梭,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酝枢,居然都是意外死亡恬偷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)帘睦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)袍患,“玉大人,你說(shuō)我怎么就攤上這事竣付」钛樱” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵卑笨,是天一觀的道長(zhǎng)孕暇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)赤兴,這世上最難降的妖魔是什么妖滔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮桶良,結(jié)果婚禮上座舍,老公的妹妹穿的比我還像新娘。我一直安慰自己陨帆,他們只是感情好曲秉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布采蚀。 她就那樣靜靜地躺著,像睡著了一般承二。 火紅的嫁衣襯著肌膚如雪榆鼠。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天亥鸠,我揣著相機(jī)與錄音妆够,去河邊找鬼。 笑死负蚊,一個(gè)胖子當(dāng)著我的面吹牛神妹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播家妆,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鸵荠,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了伤极?” 一聲冷哼從身側(cè)響起蛹找,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哨坪,沒(méi)想到半個(gè)月后熄赡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齿税,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年彼硫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凌箕。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拧篮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出牵舱,到底是詐尸還是另有隱情串绩,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響吐绵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顷牌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塞淹。 院中可真熱鬧窟蓝,春花似錦、人聲如沸饱普。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至谁帕,卻和暖如春峡继,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匈挖。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工鬓椭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人关划。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像翘瓮,于是被迫代替她去往敵國(guó)和親贮折。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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