AddressBook

在Build Phases的Link Binary With Libraries中加两个框架ContactsUI.framework 和 Contacts.framework

Main.storyboard

#import "ViewController.h"
#import <ContactsUI/CNContactViewController.h>
#import <ContactsUI/CNContactPickerViewController.h>

@interface ViewController ()<CNContactViewControllerDelegate, CNContactPickerDelegate>

- (IBAction)newContact:(UIButton *)sender;
- (IBAction)currentContact:(UIButton *)sender;
//CNContactStore    是一个用来读取和保存联系人的新的类
@property(nonatomic, strong)CNContactStore *contactStore;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}
//      创建新的联系人
- (IBAction)newContact:(UIButton *)sender {
    [self saveNewContact];
}

- (IBAction)currentContact:(UIButton *)sender {
    [self saveExistContact];
}

//      保存新的联系人
- (void)saveNewContact{

    //      这个对象是用来配置联系人信息的,有可变的CNMutaleContact和CNContact,区别用来读取和创建联系人。CNContact对象中有许多属性,对应联系人的一些信息


    //  1.  创建Contact对象, 必须是可变的
    CNMutableContact *contact = [[CNMutableContact alloc] init];
    //  2.  创建新建好友页面
    CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:contact];

    //  3.  代理内容根据自己需要实现
    controller.delegate = self;
    //  4.  跳转
    UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller];

    [self presentViewController:navigation animated:YES completion:^{
        //  5.  为contact赋值
        //      设置联系人头像
        contact.imageData = UIImagePNGRepresentation([UIImage imageNamed:@""]);
        //      设置联系人的昵称
        contact.nickname = @"";
        //      设置联系人名字
        contact.givenName = @"";
        //      设置联系人姓氏
        contact.familyName = @"";
        //      设置联系人邮箱(邮箱信息有多种, 可以任意选择, 点击类查看CNLabeledValue)
        CNLabeledValue *email = [CNLabeledValue labeledValueWithLabel:CNLabelHome value:@""];
        contact.emailAddresses = @[email];
        //      设置联系人电话号(电话信息有多种, 可以任意选择, 点击类查看CNPhoneNumber)
        //      电话号码, 可以通过CNPhoneNumber的+号类方法创建, 或者用初始化方法创建
        contact.phoneNumbers = @[[CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberiPhone value:[CNPhoneNumber phoneNumberWithStringValue:@""]]];
        //      设置联系人地址
        //      点击CNMutablePostalAddress查看设置地址详细信息
        CNMutablePostalAddress *address = [[CNMutablePostalAddress alloc] init];
        address.state = @"中国";
        //      设置生日
        NSDateComponents *birthday = [[NSDateComponents alloc] init];
        contact.birthday = birthday;
        //      创建添加联系人请求CNSaveRequest
        CNSaveRequest *save = [[CNSaveRequest alloc] init];
        //      添加联系人
        [save addContact:contact toContainerWithIdentifier:nil];
        //      写入联系人CNContactStore
        CNContactStore *store = [[CNContactStore alloc] init];
        [store executeSaveRequest:save error:nil];
    }];



/*
        //添加一个联系人
        - (void)addContact:(CNMutableContact *)contact toContainerWithIdentifier:(nullable NSString *)identifier;

        //更新一个联系人
        - (void)updateContact:(CNMutableContact *)contact;
        //删除一个联系人
        - (void)deleteContact:(CNMutableContact *)contact;
        //添加一组联系人
        - (void)addGroup:(CNMutableGroup *)group toContainerWithIdentifier:(nullable NSString *)identifier;
        //更新一组联系人
        - (void)updateGroup:(CNMutableGroup *)group;
        //删除一组联系人
        - (void)deleteGroup:(CNMutableGroup *)group;
        //向组中添加子组
        - (void)addSubgroup:(CNGroup *)subgroup toGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);
        //在组中删除子组
        - (void)removeSubgroup:(CNGroup *)subgroup fromGroup:(CNGroup *)group NS_AVAILABLE(10_11, NA);
        //向组中添加成员
        - (void)addMember:(CNContact *)contact toGroup:(CNGroup *)group;
        //向组中移除成员
        - (void)removeMember:(CNContact *)contact fromGroup:(CNGroup *)group;

*/
}

- (void)saveExistContact{
    //1.跳转到联系人选择页面,注意这里没有使用UINavigationController
    CNContactPickerViewController *controller = [[CNContactPickerViewController alloc] init];

    controller.delegate = self;

    [self presentViewController:controller animated:YES completion:^{

    }];
}


#pragma mark - CNContactViewControllerDelegate
- (void)contactViewController:(CNContactViewController *)viewController didCompleteWithContact:(nullable CNContact *)contact{
    [viewController dismissViewControllerAnimated:YES completion:^{

    }];
}

#pragma mark - CNContactPickerDelegate
//2.实现点选的代理,其他代理方法根据自己需求实现
- (void)contactPicker:(CNContactPickerViewController *)picker didSelectContact:(CNContact *)contact{
    [picker dismissViewControllerAnimated:YES completion:^{
        //3.copy一份可写的Contact对象,不要尝试alloc一类,mutableCopy独此一家
        CNMutableContact *c = [contact mutableCopy];
        //4.为contact赋值
        [self setValue4Contact:c existContect:YES];
        //5.跳转到新建联系人页面
        CNContactViewController *controller = [CNContactViewController viewControllerForNewContact:c];
        controller.delegate = self;
        UINavigationController *navigation = [[UINavigationController alloc] initWithRootViewController:controller];
        [self presentViewController:navigation animated:YES completion:^{
        }];
    }];
}


//设置要保存的contact对象
- (void)setValue4Contact:(CNMutableContact *)contact existContect:(BOOL)exist{
            //      ContactFramework获取格式化的联系人姓名
            NSString *strName = [CNContactFormatter stringFromContact:contact style:CNContactFormatterStyleFullName];
            NSLog(@"%@", strName);

//    if (!exist) {
//        //名字和头像
//        contact.nickname = @"oriccheng";
//        //        UIImage *logo = [UIImage imageNamed:@"..."];
//        //        NSData *dataRef = UIImagePNGRepresentation(logo);
//        //        contact.imageData = dataRef;
//    }
//    //电话,每一个CNLabeledValue都是有讲究的,如何批评,可以在头文件里面查找,这里给出几个常用的,别的我也不愿意去研究
//    CNLabeledValue *phoneNumber = [CNLabeledValue labeledValueWithLabel:CNLabelPhoneNumberMobile value:[CNPhoneNumber phoneNumberWithStringValue:@"18888888888"]];
//    if (!exist) {
//        contact.phoneNumbers = @[phoneNumber];
//    }
//    //现有联系人情况
//    else{
//        if ([contact.phoneNumbers count] >0) {
//            NSMutableArray *phoneNumbers = [[NSMutableArray alloc] initWithArray:contact.phoneNumbers];
//            [phoneNumbers addObject:phoneNumber];
//            contact.phoneNumbers = phoneNumbers;
//        }else{
//            contact.phoneNumbers = @[phoneNumber];
//        }
//    }
//    
//    //网址:CNLabeledValue *url = [CNLabeledValue labeledValueWithLabel:@"" value:@""];
//    //邮箱:CNLabeledValue *mail = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:self.poiData4Save.mail];
//    
//    //特别说一个地址,PostalAddress对应的才是地址
//    CNMutablePostalAddress *address = [[CNMutablePostalAddress alloc] init];
//    address.state = @"辽宁省";
//    address.city = @"沈阳市";
//    address.postalCode = @"111111";
//    //外国人好像都不强调区的概念,所以和具体地址拼到一起
//    address.street = @"沈河区惠工街10号";
//    //生成的上面地址的CNLabeledValue,其中可以设置类型CNLabelWork等等
//    CNLabeledValue *addressLabel = [CNLabeledValue labeledValueWithLabel:CNLabelWork value:address];
//    if (!exist) {
//        contact.postalAddresses = @[addressLabel];
//    }else{
//        if ([contact.postalAddresses count] >0) {
//            NSMutableArray *addresses = [[NSMutableArray alloc] initWithArray:contact.postalAddresses];
//            [addresses addObject:addressLabel];
//            contact.postalAddresses = addresses;
//        }else{
//            contact.postalAddresses = @[addressLabel];
//        }
//    }
}

@end
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值