码迷,mamicode.com
首页 > 其他好文 > 详细

第十四讲(下) 可视化方式的实现通讯录.(及storyboard方式)

时间:2015-10-01 16:26:59      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:

代码演示:

 

AddressBookModel.m 用于创建第一个页面 包括cell的自定义高度问题

 

  1 #import "ViewController.h"
  2 #import "TableViewCell.h"
  3 #import "DetailViewController.h"
  4 @interface ViewController ()<UITableViewDataSource,UITableViewDelegate,DetailVCDelegate>
  5 
  6 
  7 @property (weak, nonatomic) IBOutlet UITableView *tableView;
  8 @property(nonatomic,strong)NSMutableArray *dataArray;
  9 
 10 
 11 @end
 12 
 13 @implementation ViewController
 14 
 15 - (void)viewDidLoad {
 16     [super viewDidLoad];
 17       self.dataArray = [NSMutableArray array];
 18     
 19     //预估tableViewCell的高度
 20     self.tableView.estimatedRowHeight = 120;
 21     //自适应高度(以后用这个)
 22     self.tableView.rowHeight = UITableViewAutomaticDimension;
 23     
 24 //    self.navigationController.navigationBar.translucent = NO;
 25     
 26 }
 27 
 28 - (IBAction)insertbutton:(UIBarButtonItem *)sender {
 29     DetailViewController *detailVC = [self.storyboard  instantiateViewControllerWithIdentifier:@"ABC"];
 30     
 31     //数据传入第一个界面的代理
 32     detailVC.delegate = self;
 33     
 34     [self.navigationController pushViewController:detailVC animated:YES];
 35     
 36 }
 37 
 38 - (IBAction)deleteButton:(UIBarButtonItem *)sender {
 39     
 40   [self.tableView setEditing:!self.tableView.isEditing animated:YES];
 41     
 42     
 43 }
 44 
 45 
 46 //代理方法的实现
 47 -(void)passValueDelegate:(AddressBookModel *)passModel
 48 {
 49     //代理方法传过来的值添加到数组中
 50     [self.dataArray addObject:passModel];
 51     //刷新tableView
 52     [self.tableView reloadData];
 53     
 54 }
 55 
 56 
 57 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 58 {
 59     return self.dataArray.count;
 60 
 61 }
 62 
 63 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
 64 {
 65     //注意 这里是TableViewCell记清楚
 66     TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL" forIndexPath:indexPath];
 67 
 68         cell.model = self.dataArray[indexPath.row];
 69 //    [self.tableView reloadData];
 70 
 71     return cell;
 72 }
 73 
 74 
 75 //点击cell,返回第二个界面进行信息的修改
 76 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 77 {
 78      DetailViewController *detailVC = [self.storyboard  instantiateViewControllerWithIdentifier:@"ABC"];
 79     //属性赋值第二步 把dataArray赋值给属性传值的对象
 80     detailVC.model = self.dataArray[indexPath.row];
 81     
 82     //修改值的代理
 83     detailVC.delegate = self;
 84     //传递indexPath.row的作用是再传回来,作为代理方法中的参数使用
 85     detailVC.index = indexPath.row;
 86     
 87     [self.navigationController pushViewController:detailVC animated:YES];
 88     
 89 }
 90 //修改值的代理方法
 91 -(void)changeValueToListVC:(AddressBookModel *)passModel index:(NSInteger)index
 92 {
 93     //替换数组 index位置的元素 为新的model
 94     [self.dataArray replaceObjectAtIndex:index withObject:passModel];
 95     // 刷新tableView
 96     [self.tableView reloadData];
 97     
 98 }
 99 
100 
101 
102 
103 
104 
105 // 设置哪个cell可以编辑
106 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
107 {
108     return self;
109 }
110 //真正的执行编辑的事情
111 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
112 {
113     //在编辑时,以一定要先处理好数据源,然后再处理view
114     [self.dataArray removeObjectAtIndex:indexPath.row];
115     //tableView 删除一个cell的方法,第一个参数代表 删除哪个分区的cell 第二个参数代表 删除时的动画
116     [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
117     
118     
119 }

 

TableViewCell.h  和  TableViewCell.m 文件 用于第一个界面的Model类的定义

 

 1 #import <UIKit/UIKit.h>
 2 #import "AddressBookModel.h"
 3 @interface TableViewCell : UITableViewCell
 4 
 5 @property (weak, nonatomic) IBOutlet UIImageView *image;
 6 
 7 @property (weak, nonatomic) IBOutlet UILabel *lable1;
 8 
 9 
10 @property (weak, nonatomic) IBOutlet UILabel *lable2;
11 
12 @property (weak, nonatomic) IBOutlet UILabel *lable3;
13 
14 @property (weak, nonatomic) IBOutlet UILabel *lable4;
15 
16 @property (weak, nonatomic) IBOutlet UILabel *content;
17 
18 
19 @property(nonatomic,strong)AddressBookModel *model;
20 
21 @end

 

 1 #import "TableViewCell.h"
 2 
 3 
 4 
 5 
 6 @implementation TableViewCell
 7 
 8 //重写model的setter方法  将model接收到的值,赋给本身的lable*********************
 9 -(void)setModel:(AddressBookModel *)model
10 {
11     self.lable1.text = model.name;
12     self.lable2.text = model.age;
13     self.lable3.text = model.sex;
14     self.lable4.text = model.phone;
15     self.content.text = model.content;
16     // 把NSData转换成image类型 ****
17     self.image.image = [UIImage imageWithData:model.image];
18     
19     
20 }
21 
22 @end

 

 

DetailViewController.h文件 用于第二个详情界面的属性定义

 

 1 #import <UIKit/UIKit.h>
 2 #import "AddressBookModel.h"
 3 
 4 @protocol DetailVCDelegate <NSObject>
 5 
 6 //传值的代理方法
 7 -(void)passValueDelegate:(AddressBookModel *)passModel;
 8 //修改的代理方法
 9 -(void)changeValueToListVC:(AddressBookModel *)passModel index:(NSInteger)index;
10 
11 @end
12 
13 
14 
15 @interface DetailViewController : UIViewController
16 
17 @property (weak, nonatomic) IBOutlet UIButton *image;
18 @property (weak, nonatomic) IBOutlet UITextField *lable1;
19 @property (weak, nonatomic) IBOutlet UITextField *lable2;
20 
21 @property (weak, nonatomic) IBOutlet UITextField *lable3;
22 
23 @property (weak, nonatomic) IBOutlet UITextField *lable4;
24 
25 @property (weak, nonatomic) IBOutlet UITextView *content;
26 
27 
28 //代理传值的属性1
29 @property(nonatomic,assign)id<DetailVCDelegate>delegate;
30 
31 //属性传值
32 @property(nonatomic,strong)AddressBookModel *model;
33 
34 //代理传值的属性2
35 @property(nonatomic,assign)NSInteger index;
36 
37 
38 @end

 

DetailViewController.m文件  第二个界面设置,一二界面的传值,以及图片的设置显示

 

  1 #import "DetailViewController.h"
  2 #import "AddressBookModel.h"
  3 @interface DetailViewController ()<UIImagePickerControllerDelegate,UINavigationControllerDelegate,UIActionSheetDelegate>
  4 //设置照片属性
  5 @property(nonatomic,strong)NSData *imageDate;
  6 
  7 @end
  8 
  9 @implementation DetailViewController
 10 
 11 - (void)viewDidLoad {
 12     [super viewDidLoad];
 13     // Do any additional setup after loading the view.
 14     
 15     self.navigationController.navigationBar.translucent = NO;
 16     [self loadLTview];
 17 }
 18 
 19 
 20 -(void)loadLTview
 21 {
 22     self.lable1.text = self.model.name;
 23     
 24     self.lable2.text = self.model.age;
 25     self.lable3.text = self.model.sex;
 26     self.lable4.text = self.model.phone;
 27     self.content.text = self.model.content;
 28     
 29     // 把前一页面传入的NSData类型的数据转换成image *****************
 30     [self.image setImage:[UIImage imageWithData:self.model.image] forState:UIControlStateNormal];
 31 
 32 }
 33 
 34 
 35 
 36 - (IBAction)saveButtonClick:(UIButton *)sender {
 37     //获取到所有可输入控件上的输入的数据
 38     NSString *nameStr = self.lable1.text;
 39     NSString *ageStr = self.lable2.text;
 40     NSString *sexStr = self.lable3.text;
 41     NSString *phoneStr = self.lable4.text;
 42     NSString *contentStr = self.content.text;
 43     
 44     
 45     //初始化一个model   传输照片时,要注意这里的格式***********
 46     AddressBookModel *model = [[AddressBookModel alloc] initWithName:nameStr age:ageStr sex:sexStr pnone:phoneStr content:contentStr image:self.imageDate];
 47     
 48     // 判断代理人是否存在,代理人是否注册了passValueDelegate 和
 49     if (self.delegate && [self.delegate respondsToSelector:@selector(passValueDelegate:)] && [self.delegate respondsToSelector:@selector(changeValueToListVC:index:)]) {
 50         // 如果self.model是否存在,如果存在 则判定为是修改联系人,所以 触发changeValueToListVC:index:方法
 51         if (self.model != nil) {
 52             // 填入的两个参数,第一个是model 注意 这个model是自己创建的 不是属性的model 第二个参数 index。告诉上一个页面需要替换数组中哪个位置的元素
 53             [self.delegate changeValueToListVC:model index:self.index];
 54         }    else{
 55             // 直接把自己创建的model 返回去
 56             [self.delegate passValueDelegate:model];
 57         }
 58     }
 59     
 60      [self.navigationController popToRootViewControllerAnimated:YES];
 61 }
 62 
 63 
 64 
 65 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
 66 {
 67     [self.view endEditing:YES];
 68     
 69 }
 70 
 71 
 72 //照片的设置------------------------------------------------------------
 73 - (IBAction)imagePickerButtonVlicked:(UIButton *)sender {
 74     
 75     UIActionSheet *action =  [[UIActionSheet alloc] initWithTitle:@"选取照片" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:nil otherButtonTitles:@"相机",@"相册", nil];
 76     
 77     [action showFromRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) inView:self.view animated:YES];
 78 }
 79 
 80 
 81 -(void)setImagePickerController:(UIImagePickerControllerSourceType)source
 82 {
 83     UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
 84     
 85     imagePicker.sourceType = source;
 86     
 87     
 88     imagePicker.delegate = self;
 89     
 90     
 91     
 92     [imagePicker setEditing:YES];
 93     imagePicker.allowsEditing = YES;
 94     
 95     //模态推出视图
 96     [self presentViewController:imagePicker animated:YES completion:nil];
 97     
 98 }
 99 
100 -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
101 {
102     switch (buttonIndex) {
103         case 0:
104             [self setImagePickerController:UIImagePickerControllerSourceTypeCamera];
105             break;
106         case 1:
107             [self setImagePickerController:UIImagePickerControllerSourceTypePhotoLibrary];
108             break;
109             
110         default:
111             break;
112     }
113     
114 }
115 
116 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
117 {
118     
119     //如果图片编辑之后 需要使用  UIImagePickerControllerEditedImage
120     //如果图片没有编辑 只需获取  UIImagePickerControllerOriginalImage
121     //    UIImage *image = [info objectForKey:@"UIImagePickerControllerOriginalImage"];
122     UIImage *image = [info objectForKey:@"UIImagePickerControllerEditedImage"];
123     
124     //UIImagePNGRepresentation  把图片转化成PNG格式 不压缩比较大
125     // UIImageJPEGRepresentation 把图片转化成JPEG的格式,第二个参数填的是一个压缩的系数,一般是 0.5
126     //    NSDate *data = UIImagePNGRepresentation(<#UIImage *image#>);
127     
128     //照片传递到上一界面时,这里要进行数据的转化***
129     self.imageDate = UIImageJPEGRepresentation(image, 0.5);
130     
131     [self.image setImage:image forState:UIControlStateNormal];
132     
133     [picker dismissViewControllerAnimated:YES completion:nil];
134     
135 }

 

 

AddressBookModel.h 和 AddressBookModel.m主要作用创建公共属性以供调用或使用

 

 1 #import <Foundation/Foundation.h>
 2 
 3 @interface AddressBookModel : NSObject
 4 
 5 @property(nonatomic,copy)NSString *name;
 6 @property(nonatomic,copy)NSString *age;
 7 @property(nonatomic,copy)NSString *sex;
 8 @property(nonatomic,copy)NSString *phone;
 9 @property(nonatomic,copy)NSString *content;
10 @property(nonatomic,copy)NSData *image;
11 
12 
13 -(id)initWithName:(NSString *)nameStr
14               age:(NSString *)age
15               sex:(NSString *)sex
16             pnone:(NSString *)phone
17           content:(NSString *)content
18             image:(NSData *)image;
19 
20 
21 
22 
23 @end

 

 1 #import "AddressBookModel.h"
 2 
 3 @implementation AddressBookModel
 4 
 5 -(id)initWithName:(NSString *)nameStr age:(NSString *)age sex:(NSString *)sex pnone:(NSString *)phone content:(NSString *)content image:(NSData *)image
 6 {
 7     
 8     self = [super init];
 9     if (self) {
10         _name = nameStr;
11         _age  = age;
12         _sex = sex;
13         _phone = phone;
14         _content = content;
15         _image = image;
16         
17     }
18     
19     return self;
20     
21 }
22 
23 
24 
25 
26 @end

 

 

界面搭建图:

 

 

技术分享

 

 

 

效果图:

 

技术分享

 

第十四讲(下) 可视化方式的实现通讯录.(及storyboard方式)

标签:

原文地址:http://www.cnblogs.com/erdeng/p/4851024.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!