(1)效果

(2)源码与第三方类库下载

http://download.csdn.net/detail/wsb200514/8155979

(3)总结

——导航控制器,能够直接用代码的push和pop来控制控制器之间的跳转。也能够使用storyboard的segue来:这里又涉及2种,一种是直接用button拖拽到还有一个控制器形成segue,这样的segue不可拦截,假设点击直接跳转。还有一种是从一个控制器拖拽到还有一个控制器形成的segue,这样的segue没有明白的点击谁来跳转,所以有一个performSegueWithIdentifier方法,一运行这种方法就跳转,所以一般用在须要推断的跳转上面,比方“登录”的button,加入addTarget之后,在button的点击方法中运行perform跳转。

——最重要的是数据的传递,正向传递的方法,主要是利用segue的属性destinationViewController获得后面一个控制器,然后给后面这个控制器赋值,能够赋值某一个地方,也能够通过一个数据模型对象把整个数据模型赋值给后面的控制器,前提是这前后两个控制器都要有这个数据模型属性。并且这个赋值操作,通常是在prepareForSegue中进行,由于这是在segue跳转之前调用的一个方法。

——还有反向传递,即点击“返回”时,值须要从当前页面传递到“返回”后的那个页面。这里须要用到代理,即在当前页面设置一个协议,然后设置一个代理属性以及代理方法(主要用来传递数据),这个代理方法的參数能够是某一个值也能够是一个数据模型对象。然后在“返回”后的那个页面上,遵守协议而且实现代理方法,接受到数据,再把数据处理一下。

——我们这里实用到tableView,所以,涉及到加入和删除cell。我们还涉及到数据永久花存储,本案例中我们利用NSKeyedArchive方法把数据存储为data格式。所以我们每次删除和加入数据后,不仅须要“刷新”tableView,还要把数据归档一遍。

——我们懒载入数组的时候,也要多一个推断:假设数组是空,我们就从数据文件里读取数据用NSKeyedUnarchive,然后再推断一下,假设读取了数据发现还是空就初始化创建这个数据。这里面的NSKeyedUnchive和上面的NSKeyedArchive都须要数据模型对象遵守NSCoding协议并实现init和encode方法,就是归档和解归档数据的方式,这里假设有子类的话,仅仅须要继承父类,然后实现子类自己的就可以。

——第三方类库的使用,能够直接把.m和.h文件拖拽到project里面就可以,当然还有其它安装方法。我们这里用到的是MBProgressHUD,下载和用法见:https://github.com/jdg/MBProgressHUD

——这里面监听键盘的值改变,我们用的是通知,记住:用到通知的时候,必须在dealloc函数里面移除通知,养成好习惯:

- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeText) name:UITextFieldTextDidChangeNotification object:self.userField];
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeText) name:UITextFieldTextDidChangeNotification object:self.pwdField];
[super viewDidLoad];
// Do any additional setup after loading the view.
} -(void)dealloc{
[[NSNotificationCenter defaultCenter]removeObserver:self];
}

——在storyboard里面的导航栏的右边不能加入2个item,所以仅仅能用代码实现,即先把右边那个取出来,然后创建一个,最后把这2个装成数组赋值给items。

//在storyboard里面无法加入两个右边button,仅仅能代码
UIBarButtonItem *addItem=self.navigationItem.rightBarButtonItem;
UIBarButtonItem *deleteItem=[[UIBarButtonItem alloc]initWithTitle:@"操作" style:UIBarButtonItemStylePlain target:self action:@selector(deleteClick)];
self.navigationItem.rightBarButtonItems=@[addItem,deleteItem];

——tableView有一个编辑操作,即,一进入编辑操作,就类似于“短信删除界面”的效果,在全部cell左边都出现一个“减号”删除button一样。默认是删除,但能够改动成加入样式。下面代码就是实现tableView点击一下可编辑再点击不可编辑的效果。

-(void)deleteClick{
self.tableView.editing=!self.tableView.isEditing;
}

——例如以下方法就是设置每个cell左边出来的是”减号“的删除,还是”加号“的加入。我们这一行是加入一行是删除。

-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
return indexPath.row%2 ? UITableViewCellEditingStyleDelete : UITableViewCellEditingStyleInsert;
}

——点击注销button后出现的是UIActionSheet,而没实用UIAlert,而且为了监听点击的时sheet上得哪个button,这个控制器还遵守了协议UIActionSheetDelegate,并实现了推断:假设是点击”确定“,那么就退出,返回登录界面,也就是须要在导航控制器上实现pop操作。

- (IBAction)logoutClick:(id)sender {
UIActionSheet *sheet=[[UIActionSheet alloc]initWithTitle:@"确定要注销嘛?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil];
[sheet showInView:self.view];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
if (buttonIndex==0) {
[self.navigationController popViewControllerAnimated:YES];
}
}

——在tableView的那个控制器上,由于有2种跳转,所以须要isKindOfClass推断一下是跳转到哪个页面。这里面else if里面就是实现了一个数据的正向传递,直接赋值就可以。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
id vc=segue.destinationViewController;
if ([vc isKindOfClass:[WPAddViewController class]]) {
WPAddViewController *addVc=vc;
addVc.delegate=self;
}else if ([vc isKindOfClass:[WPEditViewController class]]){
WPEditViewController *editVc=segue.destinationViewController;
NSIndexPath *path=[self.tableView indexPathForSelectedRow];
editVc.contact=self.contacts[path.row];
editVc.delegate=self;
}
}

——每当cell左边出现”减号“或”加号“的时候,我们一点击,就会调用以下这种方法。所以在这里我们能够推断究竟点击的是什么button,然后运行操作,假设是减号删除,我们就删除数据、更新表格、归档,假设是加入数据,我们也是加入数据、更新表格、归档。仅仅只是,我们这里的更新表格,并非用reload更新表格全部的cell,而是用tableView的delete和insert方法实现部分更新。

//删除数据或加入数据
-(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath{
if (editingStyle==UITableViewCellEditingStyleDelete) {
//1、先更新模型
[self.contacts removeObjectAtIndex:indexPath.row];
//2、再刷新表格(建议使用第一种仅仅刷新删除行下面的那些cell,另外一种刷新所有的表格,耗性能)
[self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
//[self.tableView reloadData];
[NSKeyedArchiver archiveRootObject:self.contacts toFile:filePath];
}else if (editingStyle==UITableViewCellEditingStyleInsert){
WPContact *p2=[[WPContact alloc]init];
p2.name=@"jack";
p2.phone=@"10086";
[self.contacts insertObject:p2 atIndex:indexPath.row+1];
NSIndexPath *indexPathP2=[NSIndexPath indexPathForRow:indexPath.row+1 inSection:0];
[self.tableView insertRowsAtIndexPaths:@[indexPathP2] withRowAnimation:UITableViewRowAnimationBottom];
[NSKeyedArchiver archiveRootObject:self.contacts toFile:filePath];
}
}

——由于要实现数据归档,所以在每一次更改数据(即这里存放数据的数组)后,都须要又一次归档一次。

【iOS开发-76】Private Contacts案例:导航控制器使用、数据传递、第三方类库使用、tableViewCell的加入删除、数据存储等的更多相关文章

  1. IOS开发之功能模块--自定义导航控制器类常用自定义的代码

    前言:本文篇幅不多,但是涉及到的内容却是开发中常用的. 涉及的内容: 1.统一设置导航控制器子控制器的返回按钮. 2.因为修改了系统的返回按钮,所以还需要设置手势事件. 3.隐藏底部的工具条. 这里直 ...

  2. iOS开发--隐藏(去除)导航栏底部横线

    iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分享来给小伙伴们. 1)声明UIImageV ...

  3. IOS第12天(2,UINavigationController导航控制器)

    ****HMAppDelegate.m @implementation HMAppDelegate - (BOOL)application:(UIApplication *)application d ...

  4. iOS 开发 右滑返回上一级控制器

    #import <objc/runtime.h> @interface UINavigationController (Transition)<UIGestureRecognizer ...

  5. AJ学IOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现

    AJ分享,必须精品 一:效果 第二篇里面写了怎样自定义navigation实现自定义的导航控制器左右按钮样式,但是当我们自己实现后,系统自带的向右边滑动来实现回退的功能就不能用了. 这里主要实现滑动回 ...

  6. 【iOS开发-59】LOL案例:单组tabView、alertView样式、实现监听,以及用reloadData数据刷新

    案例效果: (1)先在storyboard中拖拽出一个tableView,然后下面用代码. --tableView继承自scrollView.所以自然有滚动的特性 --最基本的还是数据转模型.以及对c ...

  7. iOS开发之-- 从当前隐藏导航界面push到下一个显示导航界面出现闪一下的问题

    在修改项目代码的过程中,遇到一个问题,就是比如主页面的导航栏是隐藏的,但是需要push到别的页面,这个时候,会出现导航栏闪一下的情况, 下面是我写的一种方案,也就是在loadView这个生命周期函数中 ...

  8. iOS开发之--最简单的导航按钮更换方法/导航颜色的改变

    有很多时候,我们需要用到导航,那么更换导航的时候,是在那用那修改,还是自定义一个导航,或者是声明一个代理方法,经过查资料和对导航属性的一些了解,用一种方法最为简单,就是在入口类里面添加一个方法,调用偏 ...

  9. ios开发级联菜单(利用父子控制器--两个菜单封装为两个子控制器来实现)

    一:1:级联菜单可以使用两个tableView来实现,也可以利用父子控制器,两个控制器来实现,根视图控制器作为两个控制器的父控制器,来管理两个子控制器.2:将左右菜单分别交给两个控制器去管理,对于一些 ...

随机推荐

  1. 621 - Secret Research

     Secret Research  At a certain laboratory results of secret research are thoroughly encrypted. A res ...

  2. 深入理解maven与应用(二):灵活的构建

    深入理解maven及应用(一):生命周期和插件 參考官方url:http://maven.apache.org/guides/index.html 一个优秀的构建系统必须足够灵活,应该可以让项目在不同 ...

  3. 基于visual Studio2013解决C语言竞赛题之1085相邻之和素数

        题目 解决代码及点评 /************************************************************************/ /* ...

  4. 九度OnlineJudge之1014:排名

    题目描述:     今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排序,没有考虑每题的分值,所以并不是最后的排名.给定录取分数线,请你写程序找出最后通过分数线的考生,并将他 ...

  5. 亚马逊AWS在线系列讲座——基于AWS云平台的高可用应用设计

    设计高可用的应用是架构师的一个重要目标,可是基于云计算平台设计高可用应用与基于传统平台的设计有很多不同.云计算在给架构师带来了很多新的设计挑战的时候,也给带来了很多新的设计理念和可用的服务.怎样在设计 ...

  6. adb 命令使用的时候出现Error

    在使用adb 命令行的时候会出现Error 重启adb server 即可,使用管理员运行Cmd 命令窗口 adb kill-server adb start-server 如果是连接真机查看的时候再 ...

  7. Swift - 动画效果的实现方法总结(附样例)

    在iOS中,实现动画有两种方法.一个是统一的animateWithDuration,另一个是组合出现的beginAnimations和commitAnimations.这三个方法都是类方法. 一,使用 ...

  8. Type Unknown error: java.lang.NullPointerException

    Android 项目开发的时候 出现: Description Resource Path Location Type Unknown error: java.lang.NullPointerExce ...

  9. javascript学习笔记--迭代函数

    概要 这里的迭代函数指的是对数组对象的操作方法,js数组共有五个迭代函数:every.fifter.forEach.map.some. 1.every every方法,返回值为Boolean类型,tr ...

  10. RAID的解释(附购买链接)

     现在使用RAID6  早期 raid5+1hotspare   小型机有存储备份 就是这么多年没有恢复过~ 金融行业 数据万金  是的 磁盘阵列柜换控制器  型号太老 缓存数据问题 把存储都下线了 ...