`
fantom
  • 浏览: 142219 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

地址薄源码分析

 
阅读更多
ContactViewController.h 头文件
#import <UIKit/UIKit.h>
//基库,一系列的Class(类)来建立和管理iPhone OS应用程序的用户界面接口、应用程序对象、事件控制、绘图模型、窗口、视图和用于控制触摸屏等的接口
#import <AddressBook/AddressBook.h>
//地址薄框架提供联系人数据库,通讯数据库等
#import <AddressBookUI/AddressBookUI.h>
//地址薄UI框架提供编辑,选择,创建通讯数据库
#import "IIAddressBook.h"
//提供解析通讯录数据的一系列方法

@interface ContactViewController : UIViewController<ABPeoplePickerNavigationControllerDelegate,
ABNewPersonViewControllerDelegate,
ABPersonViewControllerDelegate,
ABUnknownPersonViewControllerDelegate>
/**
 委托接口主要功能
ABPeoplePickerNavigationController:显示整个通讯录并可以选择一个联系人的信息
ABPersonViewController:显示一个具体联系人的信息
ABNewPersonViewController:增加一个新的联系人
ABUnknownPersonViewController:完善一个联系人的信息
 **/


@property (nonatomic, strong) IBOutlet UILabel *label;
/*
 多线程,strong<>IBOutlet引用计数加2,IBOutlet<>IB控件关联
 监听中间区域 lable文本
*/

/**
 IBAction<>IB控件动作相关联
 **/
- (IBAction)showPeoplePickerController; //监听查看按钮
- (IBAction)showNewPersonViewController;//监听新增按钮
- (IBAction)showPersonViewController; //监听编辑按钮
- (IBAction)showUnknownPersonViewController;//监听未知按钮
@end


ContactViewController.m 文件
#import "ContactViewController.h"

@implementation ContactViewController

//合成器
@synthesize label;

/**
 手动初始化ViewController nibNameOrNil 直需要文件名,无需扩展即contact(.nib不需要)
**/

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    //初始化父类ViewController
    if (self) {
        // Custom initialization
    }
    return self; //跳出
}

/**
  当内存不足时,释放不需要的内存,缓存,未显示的view等
 **/
- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    
    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView
{
}
*/


// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
/**
 视图加载时调用
 **/
- (void)viewDidLoad
{
    // 增加Code按钮,可跳转至教学页面
    //初始化一个新的按钮,使用指定的标题,样式,目标(自己还是其他view视图),出口方法。
    UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithTitle:@"Code" style:UIBarButtonItemStyleBordered target:self action:@selector(code)];
    //设置按钮到右侧
    self.navigationItem.rightBarButtonItem = item;
    //初始化
    [super viewDidLoad];
}

/**
 当内存不足时,最大程度释放内存
 **/
- (void)viewDidUnload
{
    self.label = nil; //重置lable
    [super viewDidUnload]; //释放内存
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

/**
 是否支持iphone 旋转
 **/
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    //系统默认不支持旋转功能
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}



#pragma mark -
#pragma mark Show all contacts
// Called when users tap "Display Picker" in the application. Displays a list of contacts and allows users to select a contact from that list.
// The application only shows the phone, email, and birthdate information of the selected contact.
/**
 查看联系人数据
 1、先初始化系统通讯控件
 2、设置需要显示的信息,手机等
 3、用presentModalViewController 呈现
 **/
-(void)showPeoplePickerController
{
    // 查看联系人   系统的通讯录控件
	ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self; //委托给自己
	// Display only a person's phone, email, and birthdate
   
	/**
    消息设置版
    [picker setDisplayedProperties:[NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],
                                    [NSNumber numberWithInt:kABPersonEmailProperty],
                                    [NSNumber numberWithInt:kABPersonBirthdayProperty], nil]];
    
    //属性版
     picker.displayedProperties = NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],
     [NSNumber numberWithInt:kABPersonEmailProperty],
     [NSNumber numberWithInt:kABPersonBirthdayProperty], nil];
    */
    
     //将手机,邮箱,生日数据压入数组
    NSArray *displayedItems = [NSArray arrayWithObjects:[NSNumber numberWithInt:kABPersonPhoneProperty],
                               [NSNumber numberWithInt:kABPersonEmailProperty],
                               [NSNumber numberWithInt:kABPersonBirthdayProperty], nil];
	
    //设置需要显示的数据
	picker.displayedProperties = displayedItems;
     
	// Show the picker
    //显示数据 使用 presentModalViewController可创建模式对话框,可用于视图之间的切换 
	[self presentModalViewController:picker animated:YES];

}


#pragma mark Display and edit a person
// Called when users tap "Display and Edit Contact" in the application. Searches for a contact named "Appleseed" in 
// in the address book. Displays and allows editing of all information associated with that contact if
// the search is successful. Shows an alert, otherwise.
/**
  编辑地址薄数据
 1、ABAddressBookCreate 得到地址薄
 2、查找是否有张三数据
 3、如果没有提示用户,有则进入编辑视图
 **/
-(void)showPersonViewController
{
	// 得到地址薄 iphone6.0不推荐使用
	ABAddressBookRef addressBook = ABAddressBookCreate();
	// 寻找名为“CC”的联系人
	NSArray *people = (__bridge NSArray *)ABAddressBookCopyPeopleWithName(addressBook, CFSTR("zhangsan"));
	// Display "Appleseed" information if found in the address book
    //如果有数据
	if ((people != nil) && [people count])
	{
        //ABRecordRef 一个指向Core Foundation对象的通用指针
		ABRecordRef person = (__bridge ABRecordRef)[people objectAtIndex:0];
		ABPersonViewController *picker = [[ABPersonViewController alloc] init]; //初始化
		picker.personViewDelegate = self;
		picker.displayedPerson = person;
        //精简版 picker.displayedPerson = (__bridge ABRecordRef)[people objectAtIndex:0];
		// Allow users to edit the person’s information
		picker.allowsEditing = YES;
        //更新联系人数据到编辑视图
		[self.navigationController pushViewController:picker animated:YES];
	}
	else  //没有数据则给一些提示信息
	{
		// Show an alert if "Appleseed" is not in Contacts
        //UIAlertView常用于应用界面信息警告提示 
		UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
														message:@"Could not find 张三 in the Contacts application" 
													   delegate:nil 
											  cancelButtonTitle:@"Cancel" 
											  otherButtonTitles:nil];
		[alert show]; //弹出提示
	}
	
	CFRelease(addressBook); //释放
}


#pragma mark Create a new person
// Called when users tap "Create New Contact" in the application. Allows users to create a new contact.
-(void)showNewPersonViewController
{
    // 新增联系人
	ABNewPersonViewController *picker = [[ABNewPersonViewController alloc] init];
	picker.newPersonViewDelegate = self;
	
	UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:picker];
	[self presentModalViewController:navigation animated:YES];
		
}


#pragma mark Add data to an existing person
// Called when users tap "Edit Unknown Contact" in the application. 
-(void)showUnknownPersonViewController
{
	ABRecordRef aContact = ABPersonCreate();
	CFErrorRef anError = NULL;
	ABMultiValueRef email = ABMultiValueCreateMutable(kABMultiStringPropertyType);
	bool didAdd = ABMultiValueAddValueAndLabel(email, @"John-Appleseed@mac.com", kABOtherLabel, NULL);
	
	if (didAdd == YES)
	{
		ABRecordSetValue(aContact, kABPersonEmailProperty, email, &anError);
		if (anError == NULL)
		{
			ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
			picker.unknownPersonViewDelegate = self;
			picker.displayedPerson = aContact;
			picker.allowsAddingToAddressBook = YES;
		    picker.allowsActions = YES;
			picker.alternateName = @"John Appleseed";
			picker.title = @"John Appleseed";
			picker.message = @"Company, Inc";
			
			[self.navigationController pushViewController:picker animated:YES];
		
		}
		else 
		{
			UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
															message:@"Could not create unknown user" 
														   delegate:nil 
												  cancelButtonTitle:@"Cancel"
												  otherButtonTitles:nil];
			[alert show];
		}
	}	
	CFRelease(email);
	CFRelease(aContact);
}


#pragma mark ABPeoplePickerNavigationControllerDelegate methods
// Displays the information of a selected person
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
{
    self.label.text = [IIAddressBook getFullName:person];
    //[self dismissModalViewControllerAnimated:YES];
    //return NO;
	return YES;
}


// Does not allow users to perform default actions such as dialing a phone number, when they select a person property.
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person 
								property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
	return NO;
}


// Dismisses the people picker and shows the application when users tap Cancel. 
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker;
{
	[self dismissModalViewControllerAnimated:YES];
}


#pragma mark ABPersonViewControllerDelegate methods
// Does not allow users to perform default actions such as dialing a phone number, when they select a contact property.
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person 
					property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifierForValue
{
	return NO;
}


#pragma mark ABNewPersonViewControllerDelegate methods
// Dismisses the new-person view controller. 
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonViewController didCompleteWithNewPerson:(ABRecordRef)person
{
	[self dismissModalViewControllerAnimated:YES];
}


#pragma mark ABUnknownPersonViewControllerDelegate methods
// Dismisses the picker when users are done creating a contact or adding the displayed person properties to an existing contact. 
- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownPersonView didResolveToPerson:(ABRecordRef)person
{
	[self dismissModalViewControllerAnimated:YES];
}


// Does not allow users to perform default actions such as emailing a contact, when they select a contact property.
- (BOOL)unknownPersonViewController:(ABUnknownPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person 
						   property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier
{
	return NO;
}

// 跳转至教学页面
- (void)code
{
    CodeViewController *controller = [[CodeViewController alloc] initWithNibName:@"CodeViewController" bundle:nil];
    NSString *name = [NSString stringWithUTF8String:object_getClassName(self)];
    controller.className = name;
    
    [self.navigationController pushViewController:controller animated:YES];
}

@end

分享到:
评论

相关推荐

    电话薄源代码

    通过分析这个电话薄源代码,开发者不仅可以学习到如何创建一个基本的电话簿应用,还能深入理解数据结构、文件操作、用户交互设计和错误处理等核心编程概念。此外,对于想要提高编程技能或从事类似项目的人来说,这是...

    获取本机通讯薄的内容(源码)

    因此,理解这个源码不仅能帮助我们获取Outlook和Outlook Express的通讯薄,还可能为我们提供一种通用的方法来处理其他类似任务,例如与其他邮件客户端或地址簿服务的交互。 总之,获取本机通讯薄的内容涉及对...

    封包截取源码

    【封包截取源码】是一种在编程领域中用于网络数据监测和分析的技术,主要应用于网络通信协议的解析、网络安全检测、游戏外挂开发等多个场景。易语言是一种以中文为编程语句的程序设计系统,它提供了简单易懂的编程...

    CF卡读写接口及源码

    CF卡(CompactFlash)是一种早期广泛使用的存储介质,主要用于数码相机、个人数字助理(PDA)、笔记本电脑等设备。...通过阅读和分析源码,可以进一步学习嵌入式系统、驱动开发以及存储技术的相关知识。

    易语言手机电话薄vcf转csv工具源码-易语言

    源码的分析和学习对于进阶的易语言程序员来说是非常有价值的。通过阅读和理解源代码,可以深入理解如何使用易语言进行文件读写、数据解析和转换等操作。具体来说,开发者可能使用了易语言的字符串处理命令来解析VCF...

    大智慧股票本地数据读取接口(含源码)

    起止地址 数据内容 数据含义 数据类型 00 - 03 F4 9B 13 FC 文件标志 int 04 - 07 00 06 00 00 未知 int 08 - 0B 00 00 00 00 保留 int 0C - 0F 97 04 00 00 证券总数 int 10 - 13 00 18 00 00 未知 int需添加之起始...

    JAVASQL办公自动化系统-rar.rar

    本文在分析中国办公自动化现状和存在问题基础上,分析了中国办公自动化的特点和要求,并根据南开创元信息技术有限公司的实际情况,开发了一个颇具特色的办公自动化系统——极光,它代表快速,高效与界面美观并存。...

    C#宽带拨号软件,自己开发的

    在压缩包中的“adsl”文件可能是程序源代码、配置文件或相关资源,进一步分析这些文件可以帮助理解软件的具体实现。这个自开发的C#宽带拨号软件不仅是一个实用工具,也是学习C#网络编程和系统集成的好实例。通过研究...

    云点滴客户关系管理CRM OA系统 v2.4

    一、个人中心:通讯录备忘录电话薄主要用于添加联系人信息,相当于通讯录功能,可以存贮相关联系人的基本信息,姓名、联系方式、地址、邮箱等。工作日志主要用于记录个人工作生活中大小事情的备忘,相当于备忘录功能...

    android开发资料大全

    包含资源名称下载地址 Android 开发从入门到精通 新版Android开发教程及笔记-完整版 《Android中文教程》中文版 《android基础教程合集》 Android实例教程 会员贡献索引贴 实用Android开发工具和资源精选 APK权限...

    sina.zip_CrazyitWeibo_sina_新浪微博

    通过分析和理解这些代码,开发者可以了解如何使用Java来构建一个微博客户端应用,这涵盖了网络请求、数据解析、用户界面设计等多个方面的知识。 【标签】"crazyitweibo sina 新浪微博"进一步确认了项目的主要功能和...

    PLC例程350可逆式冷轧机.rar

    350可逆式冷轧机是一种广泛应用在金属加工领域的设备,主要用于对金属板材进行连续或间歇的冷态压延,以达到减薄、强化材料的目的。其特点是能够双向操作,即正向和反向轧制,以满足不同生产工艺的需求。PLC在此系统...

    USIM卡上联系人的读写

    尤其在电话簿存储方面,USIM卡可以存储大量的电话号码,每个号码可关联多个别名、其他电话号码和电子邮件地址。 3. **需求背景**: - 随着iPhone等智能手机的流行,Android系统成为主流操作系统之一。然而,早期的...

    简易电话簿设计

    【简易电话簿设计】是一个基于计算机程序的电话薄管理系统,旨在帮助用户管理和组织联系人的电话号码。这个系统采用结构体、数组以及文件等编程概念来实现。以下是该系统的详细知识点: 1. **需求分析**: - 系统...

    云点滴客户解决方案 v1.0.0.rar

    功能强大的报表统计使得用户大数据分析变的简单,更加容易的制定销售战略。集成的短信发送 使得用户随时随地的为公司客户发送短信。简单易用的操作界面使得用户快速上手。 二、主要功能 一、个人中心:通讯录...

    云点滴客户关系管理CRM OA系统 v2.4.zip

    功能强大的报表统计使得用户大数据分析变的简单,更加容易的制定销售战略。集成的短信发送 使得用户随时随地的为公司客户发送短信。简单易用的操作界面使得用户快速上手。 云点滴客户关系管理CRM功能介绍; 一、...

    云点滴客户关系管理CRM OA系统 v1.02.13.rar

    功能强大的报表统计使得用户大数据分析变的简单,更加容易的制定销售战略。集成的短信发送 使得用户随时随地的为公司客户发送短信。简单易用的操作界面使得用户快速上手。 功能介绍; 一、个人中心:通讯录备忘...

    云点滴客户解决方案最新官方版

    功能强大的报表统计使得用户大数据分析变的简单,更加容易的制定销售战略。集成的短信发送 使得用户随时随地的为公司客户发送短信。简单易用的操作界面使得用户快速上手。 二、主要功能 一、个人中心:通讯录备忘录...

    云点滴客户关系管理CRM OA系统最新官方版

    功能强大的报表统计使得用户大数据分析变的简单,更加容易的制定销售战略。集成的短信发送 使得用户随时随地的为公司客户发送短信。简单易用的操作界面使得用户快速上手。 功能介绍; 一、个人中心:通讯录备忘录 ...

Global site tag (gtag.js) - Google Analytics