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

(1)效果

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

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

(3)总结

——导航控制器,可以直接用代码的push和pop来控制控制器之间的跳转。也可以使用storyboard的segue来:这里又涉及2种,一种是直接用按钮拖拽到另一个控制器形成segue,这种segue不可拦截,如果点击直接跳转。另一种是从一个控制器拖拽到另一个控制器形成的segue,这种segue没有明确的点击谁来跳转,所以有一个performSegueWithIdentifier方法,一执行这个方法就跳转,所以一般用在需要判断的跳转上面,比如“登录”的按钮,添加addTarget之后,在按钮的点击方法中执行perform跳转。

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

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

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

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

——第三方类库的使用,可以直接把.m和.h文件拖拽到工程里面即可,当然还有其他安装方法。我们这里用到的是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里面无法添加两个右边按钮,只能代码
    UIBarButtonItem *addItem=self.navigationItem.rightBarButtonItem;
    UIBarButtonItem *deleteItem=[[UIBarButtonItem alloc]initWithTitle:@"操作" style:UIBarButtonItemStylePlain target:self action:@selector(deleteClick)];
    [email protected][addItem,deleteItem];

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

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

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

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

——点击注销按钮后出现的是UIActionSheet,而没有用UIAlert,并且为了监听点击的时sheet上得哪个按钮,这个控制器还遵守了协议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左边出现”减号“或”加号“的时候,我们一点击,就会调用下面这个方法。所以在这里我们可以判断到底点击的是什么按钮,然后执行操作,如果是减号删除,我们就删除数据、更新表格、归档,如果是添加数据,我们也是添加数据、更新表格、归档。只不过,我们这里的更新表格,并不是用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];
        [email protected]"jack";
        [email protected]"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];
    }
}

——因为要实现数据归档,所以在每一次更改数据(即这里存放数据的数组)后,都需要重新归档一次。

时间: 2024-11-09 00:17:29

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

[菜鸟成长记]iOS开发自学笔记06-导航控制器和segue的传递数据

导航控制器通常用来显示分层内容的向下导航界面,受限于设备屏幕大小,iPhone或者iPad需要通过更多的层次访问来显示足够丰富的内容,导航控制器一般会和表视图同时存在,但不是说必须一起绑定使用,这里将表视图嵌入到导航控制器中用于分层显示视图内容,以single view application为模板建立一个project,打开Main.storyboard,点击view controller再在工具栏上点击editor->embed in->navigation controller将视图控制

iOS开发从入门到精通--导航控制器基础

导航控制器基础 实现上面的导航栏,左侧按钮,中间的TITLE,还有右侧的test按钮,和一个播放的按钮 重新创建一个VCRoot根视图控制器 #import "AppDelegate.h" #import "VCRoot.h" @interface AppDelegate () @end @implementation AppDelegate - (BOOL)application:(UIApplication *)application didFinishLaun

【iOS开发-13】大神器:如何利用cocoapods使用第三方类库,以针对UISwitch的第三方类库为例

上一篇笔记以及之前部分笔记里面有些属性设置了没效果,比如UISwitch开关控件的开关背景图片:或者直接没有那种我们想要的属性,比如直接用代码设置控件大小. 所以,我们需要用第三方类库,意思大概是我们不用UISwitch类来实例化一个对象了,而是用第三方的类来实例化一个对象,然后这个对象可以进行各种修改随心所欲. 当然,这里的逻辑就是,我们要导入第三方类库,可能需要把它头文件神马的引入进来,然后就可以实例化,但是如何用第三方类库?cocoapods神器. 安装和使用教程如下:点击这里(相当齐全)

iOS开发>学无止境 - Cell 里的视图控制器

在每个 iOS 开发者的生涯中,总有一些时候想把一个视图控制器放到一个 tableView 的 cell 中.因为这是一个有用的工具去处理我在视图控制器中的各种复杂视图及繁琐操作,而且很容易想象的一种情况是你想要将一些视图堆在另一些视图上面.另一个常见的应用场景是将 collectionView 放在 cell 里.理想情况下里面的 collectionView 拥有它自己的控制器,这样外面的 tableView 控制器不会受到关联视图和每个 collection view cell 数据的影响

【iOS开发-28】制造UITabBarController标签控制器的过程以及定制UITabBarItem文字图片的6种方式

一.一个简单的创造过程(实际项目不推荐这种方式,仅做演示理解原理用) 在AppDelegate.m中: - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //创建一个到导航控制器 UIViewController *vc1=[[UIViewController alloc]init]; UINavigationControll

【iOS开发-44】通过案例谈iOS代码重构:合并、格式化输出、宏变量、利用数组字典存储数据,以及利用plist的终极知识

首先我们今天的案例就是如下5个页面通过上一张下一张来切换: (1)第一步,基本是以很傻很直接的方式来创建,这里用到的主要点有: --把对象变量设置为全局变量使得可以在其他方法中调用来设置它们的属性 --设置了一个全局变量index,默认是0,然后通过增加减少这个index值并结合switch来调用不同的数据. --利用先调用一次change方法初始化页面,使得页面定格在第一帧. --利用按钮的enabled属性来设置按钮是否可以被点击,然后结合index的值分别在第1张和第5张时分别把上一张和下

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

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 第二篇里面写了怎样自定义navigation实现自定义的导航控制器左右按钮样式,但是当我们自己实现后,系统自带的向右边滑动来实现回退的功能就不能用了. 这里主要实现滑动回退功能 . 二:代码实现思路 首先 在 NYNavigationController.m中放一个popDelegate来放置要更改的手势代理对象 @interface NYNaviga

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

#import <objc/runtime.h> @interface UINavigationController (Transition)<UIGestureRecognizerDelegate> - (void)transitionPanGestureDidLoad; @end @interface DLNavigationTransition () @end @implementation DLNavigationTransition /** *  启动右滑pop */ +

iOS开发指南 第7章 视图控制器与导航模式 学习

1 概述 分类:平铺导航模式 标签导航模式 树形导航模式 2 模态视图 必须要一个单独的模态视图控制器 呈现 代码方法:presentViewController:animated:completion: 故事板segue方式 关闭 dismissViewControllerAnimated:completion: 获取navigationBar:拖拽一个 Editor-Embed in-Navigation Controller 创建一个navigation controller interf