昨天晚上头疼,写了一部分草草的收笔了,早上起来补发一篇文章,昨天关于委托的基本使用和概念都稍微讲了一下,最开始学习委托的时候苹果官网和中文的博客文章看了不少,相似指数比较高。委托在命名要准确,最好是一看名字就知道用法,看名字就知道是干什么用的,比如说UINavigationControllerDelegate,UITableViewDelegate,这样命名不管是自己开始还是别人维护都是一个非常省心的事情,一举两得。

页面布局

先来看下效果图,这样大概知道应该实现的内容,效果如下:

这种实现,在故事板中的布局就是一个NavigationController和一个UITableView的静态表格:

其实添加的按钮是控件库中的Bar Buttom Item,将其中的Identifier设置为Add就可以是上面的效果,有一点需要说明的,添加书籍的视图中是静态单元格,需要删除控制器中多余的方法,不然无法出现效果。

Demo实现

上面跟委托有关联的地方就是保存的时候需要将数据讲给主视图去新增,而不是自己新增数据,可以通过定义一个委托实现上面的效果,具体可以参考本人的上一篇文章。需要先定义一个Book类用来存储数据:

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h> @interface Book : NSObject<NSCoding> @property (strong,nonatomic) UIImage *ConverPicture; @property (strong,nonatomic) NSString *BookName; @property (strong,nonatomic) NSString *Author; @property (strong,nonatomic) NSNumber *Price; @end

Book.m需要存储数据实现两个方法,具体参考之前的文章NSCoder存储数据:

//
// Book.m
// MySearchBar
//
// Created by keso on 15/2/4.
// Copyright (c) 2015年 keso. All rights reserved.
// #import "Book.h" @implementation Book - (void)encodeWithCoder:(NSCoder *)aCoder{ //注意这里是存储的是JPG图片的调用
[aCoder encodeObject:UIImageJPEGRepresentation(self.ConverPicture,1.0)forKey:@"ConverPicture"];
[aCoder encodeObject:_BookName forKey:@"BookName"];
[aCoder encodeObject:_Author forKey:@"Author"];
[aCoder encodeObject:_Price forKey:@"Price"]; } - (id)initWithCoder:(NSCoder *)aDecoder{ self.ConverPicture=[UIImage imageWithData:[aDecoder decodeObjectForKey:@"ConverPicture"]];
self.BookName=[aDecoder decodeObjectForKey:@"BookName"];
self.Author=[aDecoder decodeObjectForKey:@"Author"];
self.Price=[aDecoder decodeObjectForKey:@"Price"];
return self; }
@end

  首先来看第一个视图:RootViewController.h中的声明:

#import <UIKit/UIKit.h>
#import "EditViewController.h" @interface RootViewController : UITableViewController<CustomEditViewControllerDelegate> @end

RootViewController.m中ViewDiLoad中方法加载数据:

- (void)viewDidLoad {
[super viewDidLoad]; NSArray *codepath= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); self.BookPath= [codepath[0] stringByAppendingPathComponent:@"Book.plist"];
//这个路径暂时好像还没有存储数据的说 NSFileManager *fileManager = [NSFileManager defaultManager];
self.BookList=[[NSMutableArray alloc]init];
NSLog(@"%@",NSHomeDirectory());
if([fileManager fileExistsAtPath:_BookPath]){
self.BookList=[NSKeyedUnarchiver unarchiveObjectWithFile:self.BookPath];
} }

实现UITableView中的方法:

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

    return 1;
} - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.BookList count];
} - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellflag = @"BookCellFlag"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellflag]; Book *book=self.BookList[indexPath.row]; [cell.textLabel setText:book.BookName]; [cell.detailTextLabel setText:book.Author]; [cell.imageView setImage:book.ConverPicture]; return cell;
} - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ if ([segue.identifier isEqualToString:@"editSegue"]) {
EditViewController *controller = segue.destinationViewController;
[controller setCustomDelegate:self];
} }

  prepareForSegue用来处理新增的动作,主视图生命了自定义的委托,需要实现其方法供子视图调用:

-(void)saveBookInfo:(EditViewController *)controller{

    if (self.BookList==nil) {
self.BookList=[[NSMutableArray alloc]init];
} Book *book=controller.OriginalBook;
[self.BookList addObject:book]; //将文件整体写入之后更新数据
[NSKeyedArchiver archiveRootObject:self.BookList toFile:self.BookPath]; [self.tableView reloadData]; }

 子视图的.h文件中的声明:

#import <UIKit/UIKit.h>
#import "Book.h" @class EditViewController; #pragma mark - 自定义委托
@protocol CustomEditViewControllerDelegate <NSObject> //定义一个方法,在根视图中保存数据
- (void)saveBookInfo:(EditViewController *)controller; @end @interface EditViewController : UITableViewController <UIImagePickerControllerDelegate,UIPickerViewDelegate,UIPickerViewDataSource,
UINavigationControllerDelegate> @property (weak, nonatomic) id<CustomEditViewControllerDelegate> customDelegate; @property (strong,nonatomic) Book *OriginalBook; @property (weak, nonatomic) IBOutlet UIImageView *converImage; @property (weak, nonatomic) IBOutlet UITextField *bookNameText; @property (weak, nonatomic) IBOutlet UITextField *authorText; @property (weak, nonatomic) IBOutlet UITextField *priceText; @end

  其中需要注意的是自定义的委托,需要传递一个子视图,先用Class声明一下使用到的类,子视图也比较简单,选择图片之前有一篇博客已经写过如何使用,其他的就是控件赋值,详细代码如下:

//
// EditViewController.m
// MySearchBar
//
// Created by keso on 15/2/4.
// Copyright (c) 2015年 keso. All rights reserved.
// #import "EditViewController.h" @interface EditViewController () @end @implementation EditViewController - (void)viewDidLoad {
[super viewDidLoad]; // Uncomment the following line to preserve selection between presentations.
// self.clearsSelectionOnViewWillAppear = NO; // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
// self.navigationItem.rightBarButtonItem = self.editButtonItem; } - (IBAction)chooseConverImage:(id)sender { UIImagePickerController *picker=[[UIImagePickerController alloc]init];
// 指定照片源
[picker setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
// 指定是否允许修改
[picker setAllowsEditing:YES];
// 指定代理
[picker setDelegate:self];
// 显示照片选择控制器
[self.navigationController presentViewController:picker animated:YES completion:nil]; }
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{ UIImage *image = info[@"UIImagePickerControllerEditedImage"];
//设置图片
[self.converImage setImage:image];
[self.navigationController dismissViewControllerAnimated:YES completion:nil]; } - (IBAction)saveBook:(id)sender { if (self.OriginalBook==nil) {
self.OriginalBook=[[Book alloc]init];
}
//书籍名称
_OriginalBook.BookName=_bookNameText.text;
//封面
_OriginalBook.ConverPicture=_converImage.image;
_OriginalBook.Author=_authorText.text;
_OriginalBook.Price=[[NSNumber alloc] initWithFloat:[_priceText.text floatValue]]; // 通知父视图控制器(用户列表)保存用户记录,并且返回
[_customDelegate saveBookInfo:self]; //返回到上级视图
[self.navigationController popViewControllerAnimated:YES]; } - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end

  这个也算是一个委托的小Demo吧,比昨天那两个稍微好点,用到的知识点之前的博客中已经写过,如果有问题可以共同探讨,如有不当,可以评论区交流,感激不尽~

iOS开发-委托实战的更多相关文章

  1. iOS开发-委托(Delegate)浅谈

    委托其实并不是OC中才有,C#中也有,不过彼此的理解方式是不一样的,OC中委托是协议的一种,需要使用@protocol声明,委托一般在iOS开发中页面中传值用的比较多.委托是Cocoa中最简单.最灵活 ...

  2. iOS开发-CocoaPods实战

    CocoaPods 是开发 OS X 和 iOS 应用程序的第三方库的依赖管理工具,如果是正常的开发不需要使用的第三方的代码,CocoaPods是不需要的,但是从实际情况上,为了提高开发效率,Coco ...

  3. iOS开发项目实战——Swift实现图片轮播与浏览

    近期開始开发一个新的iOS应用,自己决定使用Swift.进行了几天之后,发现了一个非常严峻的问题.那就是无论是书籍,还是网络资源,关于Swift的实在是太少了,随便一搜全都是OC实现某某某功能.就算是 ...

  4. iOS开发项目实战——Swift实现ScrollView滚动栏功能

    手机作为一个小屏设备,须要显示的信息往往无法在一个屏幕上显示,此时就须要使用到滚动栏,当然除了像TableView这样能够自带滚动功能的. 假设一个界面上View较多,那就必须要使用到ScrollVi ...

  5. IOS开发----委托机制

    委托模式从GoF装饰模式.适配器模式和模板方法等演变过来,几乎每一个应用都会或多或少的用到委托模式. 在古希腊有一个哲学家,他毕生只做三件事情:“睡觉”.“吃饭”.和“工作”.为了更好的生活,提高工作 ...

  6. iOS开发-UIScreenEdgePanGestureRecognizer实战

    UIScreenEdgePanGestureRecognizer名字很长,而且关于其文档也是少的的可怜,苹果官方给的唯一的一个属性是edges,文档中的解释是这样的: A UIScreenEdgePa ...

  7. IOS开发-项目实战-点赞功能的实现

    实现思路: 1.每一条新闻就是一个cell,在cell上添加点赞按钮. 2.让cell的控制器成为自定义cell的代理,将点击了哪一个cell放在代理方法中传出去. 3.并将这条新闻的ID和当前用户的 ...

  8. iOS开发——项目实战总结&Block使用注意点浅析

    Block使用注意点浅析 1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock ...

  9. iOS开发——项目实战总结&带你看看Objective-C的精髓

    带你看看Objective-C的精髓 1:接口与实现 @interface...@end @implementation...@end @class 接口(头文件) 实现文件 向前引用 注:类别通过增 ...

随机推荐

  1. 2017-2018-1 20179202《Linux内核原理与分析》第十周作业

    一.设备与模块 1.设备类型 块设备:随机访问设备中的内容,通过块设备结点访问,通常被挂载为文件系统 字符设备:不可寻址,仅提供数据的流式访问,通过字符设备结点访问,应用程序通过直接访问设备节点与字符 ...

  2. RMQ_第一弹_Sparse Table

    title: RMQ_第一弹_Sparse Table date: 2018-09-21 21:33:45 tags: acm RMQ ST dp 数据结构 算法 categories: ACM 概述 ...

  3. 「长乐集训 2017 Day10」划分序列 (二分 dp)

    「长乐集训 2017 Day10」划分序列 题目描述 给定一个长度为 n nn 的序列 Ai A_iA​i​​,现在要求把这个序列分成恰好 K KK 段,(每一段是一个连续子序列,且每个元素恰好属于一 ...

  4. jdk1.8安装后查看Java -version出错

    最近在电脑行安装了多个jdk的版本 分别是jdk1.6,jdk1.7,jdk1.8三个版本,在配置环境变量的时候,选择的是jdk1.7; 但是奇怪的是,当我在cmd中输入java -version后, ...

  5. Top 5 SSH Clients for Windows (Alternatives of PuTTY)

    这篇博文列举了可以替代putty的5个工具,有些实现了putty没有实现的一些功能.如下: PuTTy is the most popular SSH clients for Windows-base ...

  6. Mac 上关于TFTP Server 软件的使用

    软件下载地址 http://ww2.unime.it/flr/tftpserver/ 软件下载后进行安装,打开软件, 如果出现如下图所示情况 然后当你点击蓝色的Fix 按钮时,如果又出现如下提示 这时 ...

  7. 【SQL】180. Consecutive Numbers

    Write a SQL query to find all numbers that appear at least three times consecutively. +----+-----+ | ...

  8. 【BZOJ 2318】 2318: Spoj4060 game with probability Problem(概率DP)

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 371  Sol ...

  9. 直接插入排序(初级版)之C++实现

    直接插入排序(初级版)之C++实现 一.源代码:InsertSortLow.cpp /*直接插入排序思想: 假设待排序的记录存放在数组R[1..n]中.初始时,R[1]自成1个有序区,无序区为R[2. ...

  10. BZOJ1597 USACO2008土地购买

    斜率优化DP. #include<bits/stdc++.h> using namespace std; ; long long f[N],n,cnt,q[N]; ; bool v[N]; ...