2016-1-5第一个完整APP 私人通讯录的实现 3:添加联系人

一:创建模型对象: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 1;
}
//每组有多少行(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-1 inSection:0];
    [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;
    }
}

四:实际效果如下:

时间: 2024-12-28 13:00:23

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

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

一:建立编辑联系人的controller,并使其拥有模型contact,且有协议.代码如下 #import <UIKit/UIKit.h> #import "contact.h" @class EditContactViewController ; @protocol EditContactViewControllerDelegate<NSObject> - (void) editContactViewController:(EditContactViewCon

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

一:登陆界面 1):用户点击登陆按钮并成功登陆后,根据此时的开关情况选择是否保存数据,代码如下: if ([acount isEqualToString:@"zhangsan"]&&[password isEqualToString:@"123"]) { [self performSegueWithIdentifier:@"ContactsViewController" sender:nil]; [MBProgressHUD sh

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

一:在登录时弹出提示用户的提示框: 1.使用第三方框架. 2.在登陆按钮点击事件中增加如下代码: - (IBAction)loginBtnClicked { NSString *acount = self.acountField.text; NSString *password = self.passwordField.text; // 跳出正在登陆的提示框 [MBProgressHUD showMessage:@"正在登陆"]; // 模拟加载中 QAQ 感觉好喜感啊 dispatc

iOS完整App资源收集

前言 iOS开发学习者都希望得到实战训练,但是很多资料都是只有一小部分代码,并不能形成完成的App,笔者在此处收集了很多开源的完整的App,都有源代码哦! 本篇文章持续更新中,请持续关注.本篇所收集的内容来源于四面八方,若大家看到好的资源,欢迎在评论中提出,笔者会整理至文章中,谢谢! 完整项目 Phonetic Swift 写的一个 iOS 版的 Phonetic Contacts,功能很多,其中昵称功能非常实用,已在 GitHub 开源并上架 App Store v2ex – v2ex 的客户

记自己的第一个完整的java web项目

我是从asp.net平台转到java平台的.基于asp.net平台开发网站的快速便捷性,工作几年来大小网站多少也写了6.7个.但是转到java后,因为是在一家大公司,而且做的功能也比较单一,局限于此,一直未能使用java来写一个web站点.后来正好大学同学从事淘宝电商,让我帮他弄一个网站,所以我就想到了使用java来开发这个站点,正好练手一下java顺便也是使用一下bae,因为很早之前就接触到了BAE,但是问题在于无法部署asp.net的网站,所以只好作罢,这次正好是一个难得的机会.     考

解题报告——2018级2016第二学期第一周作业

解题报告——2018级2016第二学期第一周作业 D 算24 题目描述 描述 给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式.现在的问题是,是否存在一种方式使得得到的表达式的结果等于24. 这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法). 比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24.又比如,对于1,1,4,2,我们怎么都不能得到24. 输入 输入数据包括多

swift2.2 我的第一個XCode APP程式

STEP1:開啟 Xcode 6 到Application 中,選取Xcode 6 ,來打開程式編輯環境工具. 圖5 選取Xcode 6. STEP2: 版權宣告的視窗 第一次執行時會出現版權宣告的視窗,只要選取"Agree同意"按鍵. 圖6 選取"Agree同意"按鍵 STEP3:建立一個全新的程式專案 在進入"Xcode 的歡迎視窗"後,請選取"Create a new Xcode project",來建立一個全新的程式專

私人通讯录

一.私人通讯录 什么是Segue ● Storyboard上每?一根?用来界?面跳转的线,都是?一个UIStoryboardSegue对象(简称Segue) "[登录界面]" 1.掌握UIStoryboardSegue对象 (1)在storyboard中,可以通过连线完成多个界面间的跳转,每一连线我们称为segue (2)掌握storyboard中的segue连线有两种,一是自动跳转.二是手动跳转 自动跳转从按钮连线,不管账号和密码是不是正确,就直接跳到下一个界面,而手动跳转,是用控制

iOS开发UI篇—实现一个私人通讯录小应用(二)

iOS开发UI篇—实现一个私人通讯录小应用(二) 一.实现功能说明 (1)点击注销按钮,弹出一个对话框,点击确定后移除当前栈顶的控制器,返回开始界面,点击取消,不做任何操作. 注意:注销按钮的单击事件已经进行了连线.实现-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex需要遵守UIActionSheetDelegate协议. 1 //注销按钮 2 - (IBActi