第十一章 表行(table row)刪除腐碱,自定義按鈕,社交分享和 MVC

如果你花費(fèi)太多時間思考一件事掉弛,你永遠(yuǎn)不會完成它症见。至少為你的目標(biāo)制定一個每天的行動計(jì)劃。
-Bruce Lee

現(xiàn)在你知道如何處理表行選擇殃饿。但是怎樣刪除它谋作?我們?nèi)绾尾拍軓?UITableView刪除一行?
這是當(dāng)構(gòu)建一個基于表的 app 時常見的問題乎芳,當(dāng)處理數(shù)據(jù)時插入和更新都是基本的操作遵蚜。我們已經(jīng)討論過關(guān)于選擇的問題。這章我們討論一下刪除奈惑。此外谬晕,我們將添加一些新特性到 FoodPin app:
1.當(dāng)用戶在表行里水平滑動時添加一個自定義動作按鈕。這通常被稱作 Swipe for More 動作携取。
2.添加一個社交分享到 app,這允許用戶在 Twitter 或者 Facebook 上分享餐廳帮孔。
這章有很多東西要學(xué)習(xí)雷滋,但是這將很好玩很值得不撑。我們開始吧。

簡短的介紹 Model View Controller(mvc)

在跳到代碼部分之前晤斩,我將給你們介紹一下 MVC 模式焕檬,這是用戶界面編程被引述得最多的設(shè)置模式之一。
我盡量保持這本書盡可能實(shí)用澳泵,很少談?wù)摼幊汤碚撌涤蕖R簿褪钦f,你無法避免學(xué)習(xí) MVC兔辅,特別你的目標(biāo)是構(gòu)建偉大的應(yīng)用程序或者成為一個稱職的程序員腊敲。MVC 并不是一個只適用于 iOS 編程的概念。如果你學(xué)習(xí)過其他編程語言你可能已經(jīng)聽說過它维苔,比如 Java 或者 Ruby碰辅。它是一個強(qiáng)大的設(shè)計(jì)模式用于設(shè)計(jì)一個軟件應(yīng)用程序,不管它是移動 app 還是 web app介时。

理解 MVC

MVC 的核心没宾,對以后的框架來說最具影響力的想法,我把它叫做分開描述(Separated Presentation)沸柔。分開描述背后的想法是在域?qū)ο?domain objects)之間制造一個明確的分工循衰,用來模擬我們現(xiàn)實(shí)世界的感知,演示對象是我們在屏幕上看到的 GUI 元素褐澎。域?qū)ο髴?yīng)該完全自包含并且在沒有參考的情況下運(yùn)行到演示会钝,他們還應(yīng)該能夠支持多個演示,甚至可能需要同時支持乱凿。這個方法曾經(jīng)也是 Unix 文化的一個重要組成部分顽素,持續(xù)到現(xiàn)在它允許很多應(yīng)用程序通過圖像和命令行界面來操作。
— Martin Fowler

不管之前你學(xué)的哪種編程語言徒蟆,你需要知道的一個重要的概念是關(guān)注分離(Separation of Concerns,SoC)胁出。這個概念非常簡單。這里段审,Concerns 是軟件功能的不同方面全蝶。這個概念鼓勵開發(fā)者把復(fù)雜的功能或者程序分解成幾個方面的問題以便每個區(qū)域有它自己的職責(zé)。我們之前章節(jié)解釋的委托部分寺枉,就是 SoC 的一個例子抑淫。
MVC 概念是SoC 的另一個例子。MVC 背后的核心理念是把一個用戶界面分離成三個區(qū)域(或者對象群)姥闪,每個區(qū)域負(fù)責(zé)一個特殊的功能始苇。顧名思義,MVC 把一個用戶界面分解成三個部分:

  • Model - model 是負(fù)責(zé)保存數(shù)據(jù)或者任何數(shù)據(jù)上的操作筐喳。model 和數(shù)組對象儲存表數(shù)據(jù)一樣簡單催式。添加函喉,更新和刪除都是操作的例子。在商業(yè)世界荣月,這些操作通常被稱作商業(yè)規(guī)則管呵。
  • View - view 管理著信息的視圖顯示。舉例哺窄,UITableView列表顯示數(shù)據(jù)格式捐下。
  • Controller - controller 是連接 model 和 view 的橋梁。它翻譯了用戶的交互從view(如水龍頭)到 model 里執(zhí)行適當(dāng)?shù)牟僮髅纫怠Ee例坷襟,一個用戶在view里按了刪除按鈕。因此咽白,controller 在 model 里觸發(fā)了一個刪除操作啤握。一旦完成操作,model 要求 view 刷新自己來體現(xiàn)數(shù)據(jù)模型的更新晶框。

為了幫助你更好的理解 MVC排抬,我們使用 SimpleTable app(我們在第八章構(gòu)建的 app)作為例子。這個 app 在 table view 里顯示了餐廳的一個清單授段。如果你執(zhí)行一個可視化的插畫蹲蒲,這是如何顯示表數(shù)據(jù)的:


restaurantNames 對象是Model,它是一個數(shù)組侵贵。每一個表行(table row)映射到一個 restaurantNames 數(shù)組届搁。UITableView 對象是用戶可見的真實(shí)的 View。它負(fù)責(zé)所有的圖形部分(如表行的顏色窍育,tableview 的風(fēng)格卡睦,分離風(fēng)格,等等)漱抓。UITableViewController 方法就是 Controller表锻,作為table view 和數(shù)據(jù) model 之間的橋梁。它管理 table view 然后負(fù)責(zé)從 model 中讀取數(shù)據(jù)乞娄。

從 UITableView 里刪除一行

我希望你現(xiàn)在有一個對于 MVC 有一個更好的理解瞬逊。讓我們來到代碼部分看看我們?nèi)绾螐?table view 刪除行。我們將繼續(xù)開發(fā) FoodPin app和添加”delete”特性仪或。
如果你理解 MVC 模式确镊,你可能有一些行刪除執(zhí)行的想法。這里有我們必須做的3個主要的任務(wù):
1范删、授權(quán) table view 滑動刪除的特性以便用戶可以選擇刪除選項(xiàng)蕾域。
2、從數(shù)據(jù)模型中刪除對應(yīng)的表數(shù)據(jù)到旦。
3束铭、重載 table view 來反映表數(shù)據(jù)的改變廓块。

授權(quán)滑動刪除特性

在 iOS app 里,用戶通常水平滑動表格行來顯示刪除按鈕契沫。回想一下我們曾經(jīng)添加的 UITableViewDataSource 協(xié)議昔汉,有一個方法叫做 tableView(_:commitEditingStyle:forRowAtIndexPath:)懈万。為了讓table view能夠使用滑動刪除特性,所有你需要做的是執(zhí)行這個方法靶病。如果方法存在会通,當(dāng)用戶滑動一行時table view 會自動顯示”Delete”按鈕。
簡單的添加下面的代碼到 RestaurantTableViewController.swift 文件:

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath:NSIndexPath) {
}

現(xiàn)在我們進(jìn)行一個快速的測試娄周。在 iPhone 模擬器里運(yùn)行 app涕侈。盡管這個方法沒有任何正確的執(zhí)行,但是當(dāng)滑動行時你可以看到“Delete”按鈕煤辨。

從模型里刪除行數(shù)據(jù)

下一件事是執(zhí)行這個方法和為移除真正的表數(shù)據(jù)寫代碼裳涛。隨從方法的聲明,indexPath 參數(shù)包含的單元格行數(shù)將被刪除众辨。你可以利用這些信息來從數(shù)據(jù)數(shù)組里移除對應(yīng)的元素端三。
在 FoodPin app 里,restaurantNames鹃彻,restaurantLocations郊闯,restaurantIsVisited 都是數(shù)據(jù)模型。顯而易見的蛛株,我們必須從所有的數(shù)組移除選擇的餐廳數(shù)據(jù)团赁。為了從數(shù)組里移動一個項(xiàng),你可以簡單的調(diào)用數(shù)組對象的removeAtIndex 方法谨履。更新方法里的代碼如下:

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath:NSIndexPath) {
if editingStyle == .Delete {
//從數(shù)據(jù)源里刪除行
restaurantNames.removeAtIndex(indexPath.row)
restaurantLocations.removeAtIndex(indexPath.row)
restaurantTypes.removeAtIndex(indexPath.row)
restaurantIsVisited.removeAtIndex(indexPath.row)
restaurantImages.removeAtIndex(indexPath.row)
}
}

這個方法支持兩種類型的編輯風(fēng)格:插入和刪除欢摄。因?yàn)楫?dāng)用戶選擇刪除按鈕的適合,我們僅僅移除數(shù)據(jù)屉符,我們在執(zhí)行代碼塊之前先檢查 editingStyle剧浸。
現(xiàn)在再次運(yùn)行和測試你的 app。哎呀矗钟!app 并沒有像期望中的工作唆香。當(dāng)你按刪除按鈕的適合,單元格沒有移除吨艇。你可能會想數(shù)據(jù)沒有正確的移除躬它。在這里我們做一些調(diào)試。在方法的尾部插入下面的代碼行來打印出數(shù)組的內(nèi)容:

print(“Total item: (restaurantNames.count)”)
for name in restaurantNames {
print (name)
}

在 Swift 里东涡,你使用print方法來輸出一段信息給控制臺冯吓。打印變量的內(nèi)容是一個調(diào)試非程却基本的方法。上面的代碼在 restaurantNames 數(shù)組里打印所有的項(xiàng)數(shù)组贺,它的內(nèi)容在單元格刪除之后凸舵。默認(rèn)情況下,控制臺隱藏在 Xcode 里失尖。進(jìn)到 Xcode 菜單啊奄,選擇 View>Debug Area>Activate Console來打開控制臺。
現(xiàn)在再次編譯運(yùn)行 app掀潮。從 table view 里刪除第一行(如 Cafe Deadend)。你會在控制臺下面的調(diào)試區(qū)域找到輸出值(看下圖)仪吧。一開始,我們數(shù)組里有21個餐廳項(xiàng)择诈。在刪除一行之后,數(shù)字減少到20人断。從輸出值可以看到,”Cafe Deadend”完全被刪除了恶迈。
如你所見,app 實(shí)際上從數(shù)組里刪除了項(xiàng)暇仲〔阶觯看起來像視圖沒有顯示更新。是的奈附,就是那樣。我們僅僅移除了模型里的數(shù)據(jù)但是沒有通知 table view 來更新它自己的內(nèi)容将鸵。

重載 UITableView

一個告訴視圖重載它自己內(nèi)容的方法叫做 reloadData 方法佑颇。所以在方法里插入一行代碼來重載 table view 里的數(shù)據(jù):

override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == .Delete {
//從數(shù)據(jù)源里刪除行
restaurantNames.removeAtIndex(indexPath.row)
restaurantLocations.removeAtIndex(indexPath.row)
restaurantTypes.removeAtIndex(indexPath.row)
restaurantIsVisited.removeAtIndex(indexPath.row)
restaurantImages.removeAtIndex(indexPath.row)
}
}
tableView.reloadData()
print(“Total item: (restaurantNames.count)”)
for name in restaurantNames {
print(name)
}
}

當(dāng) reloadData 方法被調(diào)用時挑胸,table view 清除它自己的內(nèi)容然后從餐廳數(shù)組重載正確的數(shù)據(jù)來顯示⊙魍玻現(xiàn)在再次編譯測試 app簿透。當(dāng)你刪除一個餐廳,表格行應(yīng)該也被移除了老充。

從 UITableView 里刪除一行

app 正常工作了,但是這里有個更好的方式來刷新 table view戳粒〕嫔叮考慮到我們僅需要刪除一個單獨(dú)行奄妨,為什么我們不僅僅從 table view 里移除特殊行?你被允許來使用一個叫做 deleteRowsAtIndexPaths 的方法從 table view里刪除一個特別的行(或者多數(shù)行)评雌。用下面的代碼行替換 reloadData 方法:

tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)

deleteRowsAtIndexPaths方法帶來兩個參數(shù):一個索引路徑的數(shù)組(array of index path)和行動畫(row animation)直焙。這里我們僅僅通過有正確索引路徑和指定的方法來使用淡出的動畫。行動畫說明刪除動作是如何進(jìn)行的奔誓。通常使用.Fade動畫。視情況而定和措,你可以把它改變成另外的動畫比如.Right,.Left和.Top蜕煌。再次編譯運(yùn)行app。當(dāng)你確認(rèn)刪除一條記錄時斜纪,這行會淡出 table view 外。

用 UITableViewRowAction添加更多的滑動動作

當(dāng)你從一個內(nèi)置郵箱 app 里劃過表單元格時腺劣,你會看見一個垃圾桶按鈕伪冰,一個更多按鈕。更多按鈕將打開一個動作表單,表單提供了一個可選列表如回復(fù)寨辩,標(biāo)記等等。


這個”滑動更多“的特性在 iOS7的內(nèi)置 iPhone apps里第一次被引進(jìn)靡狞。在那時候隔嫡,apple 沒有讓這個特性對開發(fā)者可用腮恩。從 iOS8開始,iOS SKD 帶來了一個新的類叫做 UITableViewRowAction秸滴。你可以用這個類來給任何 table view 的表行創(chuàng)建自定義動作。為了添加自定義動作給 table view 的行咒唆,所有你需要做的是執(zhí)行 tableView(_:editActionsForRowAtIndexPath:) 方法释液,設(shè)置自定義動作作為返回事件。
我們來看看它如何工作浸船。插入下面的方法到 RestaurantTableViewController.swift 方法:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
//Social Sharing Button
let shareAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default找前, title:”share”, handler: {
(action, indexPath) -> Void in
let defaultText = “Just checking in at “ + self.restaurantNames[indexPath.row]
let activityController = UIActivityViewController(activityItems: [defaultText], applicationActivities: nil)
self.presentViewController(activityController, animated: true, completion: nil)
})
//刪除按鈕
let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title:”Delete”,handler: {
(action,indexPath) -> Void in
//從數(shù)據(jù)源里刪除行
self.restaurantNames.removeAtIndex(indexPath.row)
self.restaurantLocations.removeAtIndex(indexPath.row)
self.restaurantTypes.removeAtIndex(indexPath.row)
self.restaurantIsVisited.removeAtIndex(indexPath.row)
self.restaurantImages.removeAtIndex(indexPath.row)
self.tableView.deleteRowAtIndexPaths([indexPath], withRowAnimation: .Fade)
})
return [deleteAction, shareAction]
}

UITableViewRowAction 的用法和 UIAlertAction 很相似躺盛。當(dāng)用戶按下按鈕時你指定標(biāo)題,風(fēng)格和代碼塊來執(zhí)行周叮。在這個例子里界斜,我們把自定義動作命名為”Share”。當(dāng)用戶按下按鈕時项贺,它為社交分享引出一個活動控制器。
UIActivityViewController 類是一個標(biāo)準(zhǔn)視圖控制器棕叫,它提供幾個標(biāo)準(zhǔn)服務(wù)奕删,例如復(fù)制項(xiàng)到剪切板,分享內(nèi)容到社交媒體網(wǎng)站完残,通過消息發(fā)送項(xiàng)谨设,等等。這個類用起來很簡單扎拣。假設(shè)你有個消息要分享鹏秋。所有你需要做的是創(chuàng)造一個有信息對象的 UIActivityViewController 實(shí)例亡笑,然后在屏幕上呈現(xiàn)控制器。那就是我們在上面代碼片段做了什么百拓。
你可能會注意到晰甚,我們添加了一個刪除動作按鈕。當(dāng)你執(zhí)行 tableView(:editActionsForRowAtIndexPath:) 方法蓖捶,table view 將不再為你生成刪除按鈕扁远。這就是為什么我們需要創(chuàng)造自己的刪除按鈕。
代碼的最后一行可能是最重要的部分并闲。它返回一個 UITableViewRowAction 對象的數(shù)組(如 deleteAction 和 shareAction)谷羞,當(dāng)有人滑動單元格時告訴 table view 創(chuàng)建按鈕。
編譯運(yùn)行 app犀填。滑動一個表格行知残,它將顯示 Share 和 Delete 按鈕比庄。按下 Share 按鈕將會彈出一個分享菜單如下圖


Twitter 和 Facebook 按鈕可能不會在模擬器里出現(xiàn)佳窑。這種情況下,按住 shift-command-H 來回到主屏幕神凑,選擇 Settings>Twitter/Facebook溉委,登陸你的賬號。這是重新登陸 app瓣喊。你應(yīng)該能夠分享內(nèi)容到社交媒體網(wǎng)站上藻三。
UIActivityViewController 類并不限制你從文本格式里分享內(nèi)容。如果在初始化期間你通過一個 UIImage 對象棵帽,你的app 將允許用戶傳送圖像到 Twitter 或者 Facebook逗概。修改 tableView(
:editActionsForRowAtIndexPath: ) 方法:

override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
//社交分享按鈕
let shareAction = UITableViewRowAction(style: UITableViewRowActionsStyle.Default, title: “Share”, handler: { (action, indexPath) -> Void in
let defaultText = “Just checking in at “ + self.restaurantNames[indexPath.row]
if let imageToShare = UIImage(named: self.restaurantImages[indexPath.row]) {
let activityController = UIActivityViewController(activityItems: [defaultText, imageToShare], applicationActivities: nil)
self.presentViewController(activityController, animated: true, completion: nil)
}
})
//刪除按鈕
let deleteAction = UITableViewRowAction(style: UITableViewRowActionStyle.Default, title: “Delete”,handler: {
(action, indexPath) -> Void in
//從數(shù)據(jù)源里刪除行
self.restaurantNames.removeAtIndex(indexPath.row)
self.restaurantLocations.removeAtIndex(indexPath.row)
self.restaurantTypes.removeAtIndex(indexPath.row)
self.restaurantIsVisited.removeAtIndex(indexPath.row)
self.restaurantImages.removeAtIndex(indexPath.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
})
return [deleteAction, shareAction]
}

我們僅僅在上面的代碼里添加一些行來為分享創(chuàng)建一個 imageToShare 對象逾苫。我們用 UIImage 類來讀取圖片,然后在初始化期間把它傳遞給 UIActivityViewController藻雪。當(dāng)用戶分享餐廳到社交媒體網(wǎng)絡(luò)時狸吞,UIActivityViewController 將自動嵌入圖片指煎。


為可選項(xiàng)(Optionals)設(shè)置 if let

當(dāng)讀取一張圖片時至壤,圖片有可能讀取失敗枢纠。這就是為什么UIImage 類在初始化時返回一個可選項(xiàng)。在 Swift 里镰绎,我們使用”if let”來核實(shí)一個可選的內(nèi)容是不是一個值木西。在細(xì)節(jié)上,你可以參考附錄的 Optional部分吗讶。

自定義 UITableViewRowAction

默認(rèn)情況下恋捆,動作按鈕是紅色的。UITableViewRowAction 類為開發(fā)者提供一個可選項(xiàng)通過 backgroundColor 屬性來自定義它自己的背景色:

shareAction.backgroundColor = UIColor(red: 28.0/255.0, green: 165.0/255.0, blue: 253.0/255.0, alpha: 1.0)

UIKit 框架提供一個 UIColor 類來代表色彩纵寝。UIKit 里的許多方法要求你用 UIColor 對象提供色彩星立。這個類自帶許多標(biāo)準(zhǔn)色彩如 UIColor.blueColor() 和 UIColor.redColor()葬凳。如果你想用自己的色彩火焰,你可以用 RGB 的分量值創(chuàng)建你自己的 UIColor 對象。分量值必須包含0和1昌简。如果你是一個網(wǎng)絡(luò)設(shè)計(jì)師或者對于圖像設(shè)計(jì)有一些經(jīng)驗(yàn)纯赎,你知道 RGB 值通常在0到255。為了符合用戶UIColor 的要求犬金,當(dāng)創(chuàng)建 UIColor 對象時你必須分離每個分量值。你可以在下面的代碼行之前 tableView(_:editActionsForRowAtIndexPath:) 方法:

return [deleteAction, shareAction]

我們開始吧峰伙。再次測試 app 和看是否你喜歡新的顏色瞳氓。另一方面,修改顏色代碼和更改你的首選顏色匣摘。


Quick note:如果你像我一樣不是一個設(shè)計(jì)師恋沃,你可能需要一些顏色靈感。你可以參考 Adobe Color CC(color.adobe.com) 和 Flat UIColor Picker(flatuicolorpicker.com)恕洲。你會發(fā)現(xiàn)許多色彩組合來設(shè)計(jì)你的 app梅割。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末户辞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子刃榨,更是在濱河造成了極大的恐慌双仍,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件苞轿,死亡現(xiàn)場離奇詭異逗物,居然都是意外死亡翎卓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門蹂安,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人畜号,你說我怎么就攤上這事允瞧。” “怎么了痹升?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵畦韭,是天一觀的道長。 經(jīng)常有香客問我察郁,道長转唉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任麦轰,我火速辦了婚禮款侵,結(jié)果婚禮上侧纯,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好剃幌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布负乡。 她就那樣靜靜地躺著,像睡著了一般茂腥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上最岗,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天般渡,我揣著相機(jī)與錄音,去河邊找鬼脸秽。 笑死蝴乔,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的片酝。 我是一名探鬼主播铝穷,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼曙聂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了宁脊?” 一聲冷哼從身側(cè)響起榆苞,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎薄疚,沒想到半個月后赊琳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡板丽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年埃碱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片啃憎。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓮具,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叹阔,到底是詐尸還是另有隱情传睹,我是刑警寧澤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布睛藻,位于F島的核電站邢隧,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏按摘。R本人自食惡果不足惜纫谅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一付秕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧询吴,春花似錦、人聲如沸唠摹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肌访,卻和暖如春吼驶,著一層夾襖步出監(jiān)牢的瞬間惩激,已是汗流浹背风钻。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工酒请, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人布朦。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓昼窗,卻偏偏與公主長得像澄惊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子缤削,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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