一:创建模型对象:contact用于存放数据,也便于读取加载

#import <Foundation/Foundation.h>
@interface contact : NSObject
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *tel;
@end

二:在addContackViewController中设置代理协议,并监听输入栏

#import <UIKit/UIKit.h>

@class addContactViewConroller,contact;

@protocol AddContactViewConrollerDelegate<NSObject>
@optional
- (void)addContactViewController:(addContactViewConroller *)addContactViewController didSaveContactwithName:(NSString*)name tel:(NSString *)tel;
//传递模型使得代码可维护性更高
- (void) addContactViewController:(addContactViewConroller *)addContactViewController didSaveContactWithContact:(contact *)contact;
@end @interface addContactViewConroller :UIViewController
@property (weak, nonatomic) id<AddContactViewConrollerDelegate>delegate;
@end

在.m文件中代码如下:

#import "addContactViewConroller.h"
#import "contact.h"
@interface addContactViewConroller ()
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *telField;
@property (weak, nonatomic) IBOutlet UIButton *saveBtn;
@end
@implementation addContactViewConroller - (void)viewDidLoad {
[super viewDidLoad];
}
- (IBAction)saveBtnClick {
// 判断代理是否实现了代理方法
// if ([self.delegate respondsToSelector:@selector(addContactViewController:didSaveContactwithName:tel:)]) {
// [self.delegate addContactViewController:self didSaveContactwithName:self.nameField.text tel:self.telField.text];
if ([self.delegate respondsToSelector:@selector(addContactViewController:didSaveContactWithContact:)]) {
contact *con = [[contact alloc] init];
con.name = self.nameField.text;
con.tel = self.telField.text;
// 直接专递给代理模型数据
[self.delegate addContactViewController:self didSaveContactWithContact:con];
}
}
@end

三:

1)在contactTableViewController中创建数组用于保存接受的到模型数据,代码如下:

#import "contactTableViewController.h"
#import "contact.h"
#import "addContactViewConroller.h" @interface contactTableViewController ()<AddContactViewConrollerDelegate>
//定义一个可变数组,用于存放联系人
@property (strong, nonatomic) NSMutableArray *contacts; @end

2)实现该控制器的数据源方法,并从模型中加载数据显示到cell上

代码如下:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return ;
}
//每组有多少行(row)
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return self.contacts.count;
}
//设置显示内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"%s",__func__);
// 需要先设置cell的id,用于创建可重用cell。
//1.获得可重用的id
static NSString *Id = @"contactCell";
//2.创建可重用的cell
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:Id];
//3.显示数据
contact *contact = self.contacts[indexPath.row];
cell.textLabel.text = contact.name;
cell.detailTextLabel.text = contact.tel;
//4.返回cell
return cell;
}

3)设置自己成为addContactViewController的代理并实现代理方法,代码如下:

//- (void)addContactViewController:(addContactViewConroller *)addContactViewController didSaveContactwithName:(NSString *)name tel:(NSString *)tel
//{
//// 建立模型并赋值
// contact *con = [[contact alloc] init];
// con.name = name;
// con.tel = tel;
//// 把模型放进数组里
// [self.contacts addObject:con];
//// 隐藏目标控制器
//#warning 虽然是代理调用的这个方法,但是隐藏的还是目标控制器!
// [self.navigationController popViewControllerAnimated:YES];
//// 刷新tableView
// [self.tableView reloadData];
//}
- (void) addContactViewController:(addContactViewConroller *)addContactViewController didSaveContactWithContact:(contact *)contact
{
// 将模型放进数组里 [self.contacts addObject:contact]; // 刷新tableView
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:self.contacts.count- inSection:];
[self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
// [self.tableView reloadData]; // 隐藏目标控制器
[self.navigationController popViewControllerAnimated:YES];
}

4)从目标控制器中获得数据,代码如下:

//获取目标控制器
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
id destVc =segue.destinationViewController;
// 判断目标控制器的类型
if ([destVc isKindOfClass:[addContactViewConroller class]]) {
addContactViewConroller *addContactViewController = destVc;
// 如果符合目标控制器的类型,则设置目标控制的代理
addContactViewController.delegate = self;
}
}

四:实际效果如下:

2016-1-6第一个完整APP 私人通讯录的实现 3:添加联系人的更多相关文章

  1. 2016-1-5第一个完整APP 私人通讯录的实现 1:登录界面及跳转的简单实现2

    ---恢复内容开始--- 实际效果如上 一:Segue的学习 1.什么是Segue: Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)   ...

  2. 2016-1-7第一个完整APP 私人通讯录的实现 6:在联系人界面增加删除联系人的功能

    一:在viewDidLoad方法中代码添加一个UIBarButtonItem,并将其的类型设置成垃圾桶,代码如下: - (void)viewDidLoad { [super viewDidLoad]; ...

  3. 2016-1-7第一个完整APP 私人通讯录的实现 5:保存数据

    一:登陆界面 1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下: "]) { [self performSegueWithIdentifier:@" ...

  4. 2016-1-6第一个完整APP 私人通讯录的实现 4:编辑联系人

    一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h& ...

  5. 2016-1-6第一个完整APP 私人通讯录的实现 2:增加提示用户的提示框,监听文本框

    一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = se ...

  6. iOS完整App资源收集

    前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 本篇文章持续更新中,请持续关注.本篇所收集的 ...

  7. MUI框架开发HTML5手机APP(一)--搭建第一个手机APP

      前  言 JRedu 随着HTML5的不断发展,移动开发成为主流趋势!越来越多的公司开始选择使用HTML5开发手机APP,而随着手机硬件设备配置的不断提升,各种开发框架的不断优化,也使着H5开发的 ...

  8. MUI框架开发HTML5手机APP(一)--搭建第一个手机APP(转)

    出处:http://www.cnblogs.com/jerehedu/p/7832808.html  前  言 JRedu 随着HTML5的不断发展,移动开发成为主流趋势!越来越多的公司开始选择使用H ...

  9. 浅谈MAIC 2016第二届移动应用(APP)创新大会

    MAIC 2016第二届移动应用(APP)创新大会将于2016年12月在上海举办!MAIC一届比一届办的有质量,规模越大.今年也如约而至,预计今年MAIC规模逾2000人.大会以专业会议,创新应用展览 ...

随机推荐

  1. Qt Charts

    简述 Qt Charts模块提供了一套易于使用的图表组件.它采用了Qt Graphics View框架,因此图表可以很容易地集成到现代的用户界面. Qt Charts可以被用作QWidgets.QGr ...

  2. Uva-------(11462) Age Sort(计数排序)

    B Age Sort Input: Standard Input Output: Standard Output   You are given the ages (in years) of all ...

  3. 20145236 《Java程序设计》实验一实验报告

    北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.08 实验名称:Java开发环境的熟悉(Linux + Eclipse) 实 ...

  4. 语句:分支语句、switch case ——7月22日

    语句的类型包括:声明语句.表达式语句.选择语句.循环语句.跳转语句.异常语句 1.声明语句引:入新的变量或常量. 变量声明可以选择为变量赋值. 在常量声明中必须赋值. 例如: int i = 0;// ...

  5. 《Play for Java》学习笔记(一)项目框架

    从今天开始认真复习<Play for JAVA>,该书以一个案例为主线,以前为应付项目马马虎虎看了一遍,好多地方都不明白!现在跟着这本书再走一遍,认真模拟,当做一个项目啦!! 一.Play ...

  6. PHP获取指定时间的上个月

    主要用strtotime()这个函数 php 获得前一个月的月份 date("Y-m-d",strtotime("last month")); php获得给定时 ...

  7. linux 新增挂载新硬盘

    1. 添加磁盘,查看磁盘状况 [root@db1 /]# fdisk -l Disk /dev/sda: 10.7 GB, 10737418240 bytes 255 heads, 63 sector ...

  8. Facebook技术架构

    Facebook MySQL,Multifeed (a custom distributed system which takes the tens of thousands of updates f ...

  9. cf 307

    一开始我是不想打的  又因为307这个数字太特殊了 毕竟307  希望今天的考试不要挂掉 http://codeforces.com/contest/551/problem/A #include< ...

  10. bzoj 1818: [Cqoi2010]内部白点

    #include<cstdio> #include<iostream> #include<algorithm> using namespace std; struc ...