iOS开发-------简单通讯录(UITableView和CoreData的应用)

 最近在学习数据持久化,总体来讲,说繁琐是因为他突然出现了很多我们没有见到过的类型,简单的是 他的逻辑很单一,基本每次用的步骤都是一样的,这两天练习数据持久化,并结合FRC做了一个简单的通讯录。与其在以后的复习博客中提及,不如在当下边写边复习。

在之前我们不管是从plist中取数据,还是从本地文件中获取数据都是通过先定义一个全局数据的数组来接收,并通过下标来一个一个的取值来显示在tableView中,这样做也是可以的,但是注意的是,我们每次这么做完,都需要记住两点不要忘记:

1、修改上下文对象 NSManagedObjectConext(之前看到学长写的一篇博客,简单的就可以理解为类似 java-web的 session 属性,用来长期保存数据的,也可以理解为一个环境,所有的操作都是在这个环境下进行的)

2、更新tableView.loadView(如果不刷新tableView,那么只能在下次打开的时候才能显示修改过的数据)

FRC是什么呢,我简单的理解就是UIFetchedResultsController, 它的作用就是在 coredata 文件和 tableView 的中间架起来一个桥梁,就是随时从 环境中(NSManagedObjectContext)中获取数据,并通过回调方法,来实现对tableView的动态更新。

当然布局的工作依旧交给storyboard来解决,起始位置是一个UINavigationController(导航视图,以后会在复习博客中说到),结构如下

接下来是coreData的文件,新建方法也在上一篇文章中细说过了:


然后是 自动创建的实体类,(如何创建,上一文章中已经提及了)

//

//  People.h

//  简易通讯录001

//

//  Created by YueWen on 15/9/11.

//  Copyright (c) 2015年 YueWen. All rights reserved.

//

#import

#import

@interfacePeople:NSManagedObject

@property(nonatomic,retain)NSString* address;

@property(nonatomic,retain)NSData* image;

@property(nonatomic,retain)NSString* name;

@property(nonatomic,retain)NSString* tele;

@property(nonatomic,retain)NSString* firstWord;

@end

//

//  People.m

//  简易通讯录001

//

//  Created by YueWen on 15/9/11.

//  Copyright (c) 2015年 YueWen. All rights reserved.

//

#import"People.h"

#import"Pinyin.h"

@implementationPeople

@dynamicaddress;

@dynamicimage;

@dynamicname;

@dynamictele;

@dynamicfirstWord;

@end

语言很是苍白无力,先留一下运行效果,后面附上代码


上面提到了,首先是一个UINavigationController(导航栏),导航栏的根视图是自带的一个UITableViewController,并用的自定义cell,因为原始的风格实在是太难看了,以下是这个页面的代码:(因为头文件中没有任何的东西,所以只给出实现文件)

//

//  ContactsTVController.m

//  简易通讯录

//

//  Created by YueWen on 15/9/10.

//  Copyright (c) 2015年 YueWen. All rights reserved.

//

#import"ContactsTVController.h"

#import"AddContactVController.h"

#import

#import"People.h"

#import"UpdataContactVController.h"

#import"MyCell.h"

@interfaceContactsTVController()

@property(nonatomic,strong)NSManagedObjectContext* mangaedOjectContext;//上下文对象

@property(nonatomic,strong)NSFetchedResultsController* fetchResultsController;

@end

@implementationContactsTVController

#pragma mark - 配置数据

-(void)loadMyFetchResultsController

{

/***************配置fetchResultsController************/


//创建请求

NSFetchRequest* request = [[NSFetchRequestalloc]initWithEntityName:NSStringFromClass([Peopleclass])];


//创建一个排序描述

NSSortDescriptor* sortDescriptor = [NSSortDescriptorsortDescriptorWithKey:@"firstWord"ascending:YES];


//加在排序

    [request setSortDescriptors:@[sortDescriptor]];


//创建fetchResultsController

self.fetchResultsController = [[NSFetchedResultsControlleralloc]initWithFetchRequest:request managedObjectContext:self.mangaedOjectContext sectionNameKeyPath:@"firstWord"cacheName:nil];



//执行fetchResultsController

NSError* error;

if(![self.fetchResultsController performFetch:&error])

    {

NSLog(@"%@",[error localizedDescription]);

    }


//设置fetchResultsController的代理

self.fetchResultsController.delegate =self;

}

#pragma mark - 添加联系人的目标动作回调

- (IBAction)addContact:(UIBarButtonItem*)sender

{

//获取storyboard

UIStoryboard* storyboard = [UIStoryboardstoryboardWithName:@"Main"bundle:[NSBundlemainBundle]];


//从storyboard中获得添加联系人的页面

UINavigationController* addContactNVController = [storyboard instantiateViewControllerWithIdentifier:@"addContactNVController"];


//以模态的形式跳出

[selfpresentViewController:addContactNVController animated:YEScompletion:nil];


}

#pragma mark - 默认的加载方法

- (void)viewDidLoad {

[superviewDidLoad];


//设置标题

self.navigationItem.title =@"通讯录";


//设置左上角的编辑 bar button item

self.navigationItem.leftBarButtonItem =self.editButtonItem;


//获取该应用的上下文对象

self.mangaedOjectContext = [selfapplicationManagedObjectContext];


//配置fetchResultsController数据

[selfloadMyFetchResultsController];



}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

当然,作为要使用tableView,那么我们必须要给他数据源,以下是实现tableView data source 的方法

#pragma mark - Table view data source

//返回的是tableView的分组数

- (NSInteger)numberOfSectionsInTableView:(UITableView*)tableView {

//获取fetchResultsController的所有组

NSArray* sections = [self.fetchResultsController sections];


returnsections.count;

}

//返回的是每组 的行数

- (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section {


//获取fetchResultsController的所有的组

NSArray* sections = [self.fetchResultsController sections];


//获取每组的信息

id section0 = sections[section];


return[section0 numberOfObjects];

}

//返回的是每个cell的显示的内容

- (UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath {


staticNSString* indenfifier =@"MyCell";


//获取模型对象

People * people = [self.fetchResultsController objectAtIndexPath:indexPath];


//创建MyCell,是自定义的cell

    MyCell *cell = [tableView dequeueReusableCellWithIdentifier:indenfifier forIndexPath:indexPath];


//设置cell右侧的小箭头

[cell setAccessoryType:UITableViewCellAccessoryDisclosureIndicator];


//为cell赋值

cell.titleImage.image = [UIImageimageWithData:people.image];

    cell.nameLabel.text = people.name;

    cell.teleLabel.text = people.tele;


returncell;

}

//设置头标

-(NSString*)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section

{

//获得所有的sections

NSArray* sections = [self.fetchResultsController sections];


//返回title

return[sections[section] name];

}

那么FRC是如何感知自己的改变,从而改变tableView的呢,首先是要遵守他的协议,方法呢,就是按住Option键进入帮助文档,复制粘贴,稍作修改即可

#pragma mark - 实现 NSFetchResultsControllerDelegate 的方法

- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller

{

//tableView开始更新

[self.tableView beginUpdates];

}

- (void)controller:(NSFetchedResultsController*)controller didChangeSection:(id)sectionInfo

atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type

{


switch(type) {

//如果是加入了新的组

caseNSFetchedResultsChangeInsert:

//tableView插入新的组

[self.tableView insertSections:[NSIndexSetindexSetWithIndex:sectionIndex]

withRowAnimation:UITableViewRowAnimationFade];

break;


//如果是删除了组

caseNSFetchedResultsChangeDelete:

//tableView删除新的组

[self.tableView deleteSections:[NSIndexSetindexSetWithIndex:sectionIndex]

withRowAnimation:UITableViewRowAnimationFade];

break;

    }

}

- (void)controller:(NSFetchedResultsController*)controller didChangeObject:(id)anObject

atIndexPath:(NSIndexPath*)indexPath forChangeType:(NSFetchedResultsChangeType)type

newIndexPath:(NSIndexPath*)newIndexPath

{


UITableView*tableView =self.tableView;


switch(type) {

//如果是组中加入新的对象

caseNSFetchedResultsChangeInsert:

[tableView insertRowsAtIndexPaths:[NSArrayarrayWithObject:newIndexPath]

withRowAnimation:UITableViewRowAnimationFade];

break;

//如果是组中删除了对象

caseNSFetchedResultsChangeDelete:

[tableView deleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath]

withRowAnimation:UITableViewRowAnimationFade];

break;

//如果是组中的对象发生了变化

caseNSFetchedResultsChangeUpdate:

//**********我们需要修改的地方**********

[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];

break;

//如果是组中的对象位置发生了变化

caseNSFetchedResultsChangeMove:

[tableView deleteRowsAtIndexPaths:[NSArrayarrayWithObject:indexPath]

withRowAnimation:UITableViewRowAnimationFade];

[tableView insertRowsAtIndexPaths:[NSArrayarrayWithObject:newIndexPath]

withRowAnimation:UITableViewRowAnimationFade];

break;

    }

}

- (void)controllerDidChangeContent:(NSFetchedResultsController*)controller

{

//用自己算好的最有算法,进行排列更新

[self.tableView endUpdates];

}

当然自定义表格的高 都 为60,那么我们就通过一个方法来统一实现设置cell的高度

#pragma maek - 实现 UITableViewConrollerDelegate 方法

- (CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(NSIndexPath*)indexPath

{

return60;

}

如果想通过点击该行进入修改页面呢,就实现以下方法

//点击tableView中的元素执行的方法

- (void)tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath

{

//获取模型对象

People * people = [self.fetchResultsController objectAtIndexPath:indexPath];


//获取stroyboard

UIStoryboard* storyboard = [UIStoryboardstoryboardWithName:@"Main"bundle:[NSBundlemainBundle]];


//创建一个 UpdataContactVController 准备跳转

UpdataContactVController *  updataContactVController = [storyboard instantiateViewControllerWithIdentifier:NSStringFromClass([UpdataContactVControllerclass])];


//将模型对象赋值给 跳转页面的属性

    [updataContactVController setPeople:people];


//设置标题

updataContactVController.navigationItem.title =@"更新联系人";


//页面跳转

[self.navigationController pushViewController:updataContactVController animated:YES];


}

如果按住该行,往左一划,会出现删除界面,如何完成删除呢

首先要设置这个tableView能够进行编辑

// Override to support conditional editing of the table view.

- (BOOL)tableView:(UITableView*)tableView canEditRowAtIndexPath:(NSIndexPath*)indexPath {

// Return NO if you do not want the specified item to be editable.

returnYES;

}

然后是删除的操作

// Override to support editing the table view.

- (void)tableView:(UITableView*)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath*)indexPath

{


if(editingStyle ==UITableViewCellEditingStyleDelete) {


//从上下文中获得该模型

People * people = [self.fetchResultsController objectAtIndexPath:indexPath];


//从上下文中删除该模型

[self.mangaedOjectContext deleteObject:people];


//上下文保存

NSError* error;

if(![self.mangaedOjectContext save:&error])

        {

NSLog(@"%@",[error localizedDescription]);

        }


//跳转至根视图

[self.navigationController popViewControllerAnimated:YES];


}elseif(editingStyle ==UITableViewCellEditingStyleInsert) {

// Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view

    } 

}

以下是联系人添加的页面

其中点击图片是可以变照片的,当然选择照片也是用了苹果自带的一个工具,叫做UIImagePikcerController

就是这个属性

@property(strong,nonatomic)UIImagePickerController* imagePickerController;

回调的方法呢:

#pragma mark - 实现 imagePickerControllerDelegate 方法

//回调图片选择取消

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker

{

//返回原来的界面

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info

{


//获取到编辑好的图片

UIImage* image = info[UIImagePickerControllerEditedImage];


//把获取的图片设置成用户的头像

[self.titleImageButton setImage:image forState:UIControlStateNormal];


//返回原来的view

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

添加页面的其他代码:

//

//  AddContactVController.m

//  简易通讯录

//

//  Created by YueWen on 15/9/10.

//  Copyright (c) 2015年 YueWen. All rights reserved.

//

#import"AddContactVController.h"

#import

#import"People.h"

#import"Pinyin.h"

@interfaceAddContactVController()

//姓名的nameText

@property(strong,nonatomic)IBOutletUITextField*nameText;

//电话的teleText

@property(strong,nonatomic)IBOutletUITextField*teleText;

//地址的addressText

@property(strong,nonatomic)IBOutletUITextField*addressText;

//上下文对象

@property(strong,nonatomic)NSManagedObjectContext* mamagedObjectContext;

//图片选择器

@property(strong,nonatomic)UIImagePickerController* imagePickerController;

//显示头像的按钮

@property(strong,nonatomic)IBOutletUIButton*titleImageButton;

@end

@implementationAddContactVController

#pragma mark - 点击图片按钮,换图片的 目标动作回调

- (IBAction)changeTitleImage:(UIButton*)sender

{

[selfpresentViewController:self.imagePickerController animated:YEScompletion:nil];

}

#pragma mark - 右上角 Done 的 bar button item 动作回调

- (IBAction)doneAddContact:(UIBarButtonItem*)sender

{

//获取一个实体托管对象 people

People * people = [NSEntityDescriptioninsertNewObjectForEntityForName:NSStringFromClass([Peopleclass]) inManagedObjectContext:self.mamagedObjectContext];


//为托管对象设置属性

people.name =self.nameText.text;

people.tele =self.teleText.text;

people.address =self.addressText.text;


//设置图片属性

UIImage* image =self.titleImageButton.imageView.image;

people.image =UIImagePNGRepresentation(image);


//设置首字母

people.firstWord = [NSStringstringWithFormat:@"%c",pinyinFirstLetter([people.name characterAtIndex:0]) -32];


//上下文对象保存

NSError* error;

if(![self.mamagedObjectContext save:&error])

    {

NSLog(@"%@",[error localizedDescription]);

    }


//跳到模态

[selfdismissViewControllerAnimated:YEScompletion:nil];


}

#pragma mark - 左上角 Cancle 的 bar button item 动作回调

- (IBAction)cancleAddContact:(UIBarButtonItem*)sender

{

//跳出模态状态

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

- (void)viewDidLoad {

[superviewDidLoad];


//设置title

self.navigationItem.title =@"添加联系人";


//获取应用的上下文

self.mamagedObjectContext = [selfapplicationManagedObjectContext];


//初始化imagePickerController并配置

self.imagePickerController = [[UIImagePickerControlleralloc]init];


//是否可以编辑

self.imagePickerController.allowsEditing =YES;


//注册回调

self.imagePickerController.delegate =self;

}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

#pragma mark - 获取本应用的上下文对象

-(NSManagedObjectContext*)applicationManagedObjectContext

{

//获取应用的单例对象

#pragma mark - view加载方法

- (void)viewDidLoad

{

UIApplication * application = [UIApplication sharedApplication]; id delegate = application.delegate; //返回应用的上下文对象 return [delegate managedObjectContext];}

******************************************补充(2015 10 03) ************************************

上面的写法运行的时候会出现卡顿现象,是因为imagePickerView加载是需要很多时间的,所以会出现卡顿,如果想要避免这种情况,就要用到多线程了,当初写的时候不会有多线程,现在回来补上,详情请去后面的博客iOS学习-------多线程编程了解,这样就不回卡顿了

#pragma mark - view加载方法

- (void)viewDidLoad

{

[superviewDidLoad];


//初始化上下文对象

self.managedObjectContext = [selfapplicationManagedObjectContext];


//设置面板

[selfloadPeopleContext];


//创建图片选择器,用子线程加载,不然会出现卡顿现象

dispatch_async(dispatch_get_global_queue(0,0), ^{


//异步加载相册

self.imagePickerController = [[UIImagePickerControlleralloc]init];


//用主线程来修改属性

dispatch_async(dispatch_get_main_queue(), ^{


//可以编辑

self.imagePickerController.allowsEditing =YES;


//注册回调

self.imagePickerController.delegate =self;

        });

    });

}

这个时候需要注意,就是说,当点进去修改界面的时候,imagePickerView还不一定能够加载好,所以跳入的时候需要一个判断,不然可能会崩溃

/**

*  titleImageButton target action

*

*  @param sender 头像按钮

*/

- (IBAction)changeTitleImage:(UIButton*)sender

{

//当图片选择器必须加载完毕后,才能跳

if(self.imagePickerController !=nil)

    {

//跳至图片选择界面

[selfpresentViewController:self.imagePickerController animated:YEScompletion:nil];

    }

}

******************************************补充(2015 10 03) ************************************

点击某行,可以对该行的信息进行修改,并保存


代码与添加很像,就不再做过多的解释了,直接贴代码吧,感觉一般写程序写注释的习惯也是帮了我不少的忙

//

//  AddContactVController.m

//  简易通讯录

//

//  Created by YueWen on 15/9/10.

//  Copyright (c) 2015年 YueWen. All rights reserved.

//

#import"AddContactVController.h"

#import

#import"People.h"

#import"Pinyin.h"

@interfaceAddContactVController()

//姓名的nameText

@property(strong,nonatomic)IBOutletUITextField*nameText;

//电话的teleText

@property(strong,nonatomic)IBOutletUITextField*teleText;

//地址的addressText

@property(strong,nonatomic)IBOutletUITextField*addressText;

//上下文对象

@property(strong,nonatomic)NSManagedObjectContext* mamagedObjectContext;

//图片选择器

@property(strong,nonatomic)UIImagePickerController* imagePickerController;

//显示头像的按钮

@property(strong,nonatomic)IBOutletUIButton*titleImageButton;

@end

@implementationAddContactVController

#pragma mark - 点击图片按钮,换图片的 目标动作回调

- (IBAction)changeTitleImage:(UIButton*)sender

{

[selfpresentViewController:self.imagePickerController animated:YEScompletion:nil];

}

#pragma mark - 右上角 Done 的 bar button item 动作回调

- (IBAction)doneAddContact:(UIBarButtonItem*)sender

{

//获取一个实体托管对象 people

People * people = [NSEntityDescriptioninsertNewObjectForEntityForName:NSStringFromClass([Peopleclass]) inManagedObjectContext:self.mamagedObjectContext];


//为托管对象设置属性

people.name =self.nameText.text;

people.tele =self.teleText.text;

people.address =self.addressText.text;


//设置图片属性

UIImage* image =self.titleImageButton.imageView.image;

people.image =UIImagePNGRepresentation(image);


//设置首字母

people.firstWord = [NSStringstringWithFormat:@"%c",pinyinFirstLetter([people.name characterAtIndex:0]) -32];


//上下文对象保存

NSError* error;

if(![self.mamagedObjectContext save:&error])

    {

NSLog(@"%@",[error localizedDescription]);

    }


//跳到模态

[selfdismissViewControllerAnimated:YEScompletion:nil];


}

#pragma mark - 左上角 Cancle 的 bar button item 动作回调

- (IBAction)cancleAddContact:(UIBarButtonItem*)sender

{

//跳出模态状态

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

- (void)viewDidLoad {

[superviewDidLoad];


//设置title

self.navigationItem.title =@"添加联系人";


//获取应用的上下文

self.mamagedObjectContext = [selfapplicationManagedObjectContext];


//初始化imagePickerController并配置

self.imagePickerController = [[UIImagePickerControlleralloc]init];


//是否可以编辑

self.imagePickerController.allowsEditing =YES;


//注册回调

self.imagePickerController.delegate =self;

}

- (void)didReceiveMemoryWarning {

[superdidReceiveMemoryWarning];

// Dispose of any resources that can be recreated.

}

#pragma mark - 获取本应用的上下文对象

-(NSManagedObjectContext*)applicationManagedObjectContext

{

//获取应用的单例对象

UIApplication* application = [UIApplicationsharedApplication];

iddelegate = application.delegate;


//返回应用的上下文对象

return[delegate managedObjectContext];

}

#pragma mark - 实现 imagePickerControllerDelegate 方法

//回调图片选择取消

- (void)imagePickerControllerDidCancel:(UIImagePickerController*)picker

{

//返回原来的界面

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info

{


//获取到编辑好的图片

UIImage* image = info[UIImagePickerControllerEditedImage];


//把获取的图片设置成用户的头像

[self.titleImageButton setImage:image forState:UIControlStateNormal];


//返回原来的view

[selfdismissViewControllerAnimated:YEScompletion:nil];

}

@end

重要的代码差不多也就是这些了,本人新手一枚,如果有什么错误,感谢能够指正,不要误解更多的人.

版权声明:本文为博主原创文章,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。 https://blog.csdn.net/RunIntoLove/article/details/48376477

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容