如何使用ios masonry 使用AddressBook

iOS开发------操作通讯录(AddressBook篇)&通讯录UI(AddressBookUI篇)
上篇博文简要的介绍了如何使用AddessBook.framework来获取通讯录,但有时候又想对其做修改怎么办,那么这篇博文就总结一下如何修改系统的通讯录吧。
代码GitHub:https://github.com/YRunIntoLove/YAddressBookUIDemo
修改系统通讯录的方法
通过AddressBook.framework的各种函数来完成对AddressBook的操作。 通过AddressBookUI.framework中提供的系统UIViewController完成对AddressBook的操作,我们只需要使用这几个控制器,传入相应的参数并实现响应的协议方法就可以完成。
以上两种方法,初学者估计不会有人想用第一种,那么个人就来谈谈对这两种方法的看法:
方法比较繁琐,需要一定量的代码来完成,适合自定义UI布局来完成,相对的比较灵活。 仅需要弹出系统的控制器,传入相应的参数并实现协议方法,就可以完成对通讯录的操作,代码量较少,但UI会固定成系统通讯录的样式,用法简单但布局不灵活。
通过AddressBook.framework实现
实例化对象
实例化一个需要添加的Person属性,当然,如果是修改,那么就获取该属性喽,怎么获取可是上一篇博文介绍的呢
//实例化一个Person数据
ABRecordRef person = ABPersonCreate();
//这里因为没有addressBook属性,所以需要创建一个
ABAddressBookRef addressBook = ABAddressBookCreate();
//实例化一个CFErrorRef属性,如果实例化,下面的设置为NULL即可
CFErrorRef error = NULL;
修改联系人属性的方法
* 新增或修改(覆盖原值的过程)ABRecordRef中某个属性的方法
* record 新增或修改属性的person实例
* property 属性的key值,比如kABPersonFirstNameProperty..
bool ABRecordSetValue(ABRecordRef record, ABPropertyID property, CFTypeRef value, CFErrorRef* error);
* 删除ABRecordRef中某个属性的方法
* record 删除属性的person实例
* property 属性的key值,比如kABPersonFirstNameProperty..
bool ABRecordRemoveValue(ABRecordRef record, ABPropertyID property, CFErrorRef* error);
修改通讯录的方法
//添加联系人的方法
bool ABAddressBookAddRecord(ABAddressBookRef addressBook, ABRecordRef record, CFErrorRef* error);
//删除联系人的方法
bool ABAddressBookRemoveRecord(ABAddressBookRef addressBook, ABRecordRef record, CFErrorRef* erro);
//添加联系人
if (ABAddressBookAddRecord(addressBook, person, &error) == true)
//成功就需要保存一下
ABAddressBookSave(addressBook, &error);
//不要忘记了释放资源
CFRelease(person);
CFRelease(addressBook);
添加联系人的姓名属性
/*添加联系人姓名属性*/
ABRecordSetValue(person, kABPersonFirstNameProperty, (__bridge CFStringRef)@&Wen&, &error); //名字
ABRecordSetValue(person, kABPersonLastNameProperty, (__bridge CFStringRef)@&Yue&, &error); //姓氏
ABRecordSetValue(person, kABPersonMiddleNameProperty,(__bridge CFStringRef)@&YW&, &error); //名字中的信仰名称(比如Jane&K&Frank中的K
ABRecordSetValue(person, kABPersonPrefixProperty,(__bridge CFStringRef)@&W&, &error); //名字前缀
ABRecordSetValue(person, kABPersonSuffixProperty,(__bridge CFStringRef)@&Y&, &error); //名字后缀
ABRecordSetValue(person, kABPersonNicknameProperty,(__bridge CFStringRef)@&&, &error); //名字昵称
ABRecordSetValue(person, kABPersonFirstNamePhoneticProperty,(__bridge CFStringRef)@&Wen&, &error);//名字的拼音音标
ABRecordSetValue(person, kABPersonLastNamePhoneticProperty,(__bridge CFStringRef)@&Yue&, &error); //姓氏的拼音音标
ABRecordSetValue(person, kABPersonMiddleNamePhoneticProperty,(__bridge CFStringRef)@&Y&, &error); //英文信仰缩写字母的拼音音标
添加联系人类型属性
/*添加联系人类型属性*/
ABRecordSetValue(person, kABPersonKindProperty, kABPersonKindPerson, &error); //设置为个人类型
ABRecordSetValue(person, kABPersonKindProperty, kABPersonKindOrganization, &error);//设置为公司类型
添加联系人头像属性
/*添加联系人头像属性*/
ABPersonSetImageData(person, (__bridge CFDataRef)(UIImagePNGRepresentation([UIImage imageNamed:@&&])),&error);//设置联系人头像
添加联系人电话信息
/*添加联系人电话信息*/
//实例化一个多值属性
ABMultiValueRef phoneMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
//设置相关标志位,也可以不设置,下面的方法写NULL即可
ABMultiValueIdentifier MobileI //手机
ABMultiValueIdentifier iPhoneI //iPhone
ABMultiValueIdentifier MainI //主要
ABMultiValueIdentifier HomeFAXI //家中传真
ABMultiValueIdentifier WorkFAXI //工作传真
ABMultiValueIdentifier OtherFAXI //其他传真
ABMultiValueIdentifier PagerI //传呼
//设置相关数值
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551211&, kABPersonPhoneMobileLabel, &MobileIdentifier); //手机
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551212&, kABPersonPhoneIPhoneLabel, &iPhoneIdentifier); //iPhone
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551213&, kABPersonPhoneMainLabel, &MainIdentifier); //主要
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551214&, kABPersonPhoneHomeFAXLabel, &HomeFAXIdentifier); //家中传真
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551215&, kABPersonPhoneWorkFAXLabel, &WorkFAXIdentifier); //工作传真
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551216&, kABPersonPhoneOtherFAXLabel, &OtherFAXIdentifier);//其他传真
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&5551217&, kABPersonPhonePagerLabel, &PagerIdentifier); //传呼
//自定义标签
ABMultiValueAddValueAndLabel(phoneMultiValue, (__bridge CFStringRef)@&&, (__bridge CFStringRef)@&自定义&, &PagerIdentifier);//自定义标签
//添加属性
ABRecordSetValue(person, kABPersonPhoneProperty, phoneMultiValue, &error);
//释放资源
CFRelease(phoneMultiValue);
添加联系人的工作信息
/*添加联系人的工作信息*/
ABRecordSetValue(person, kABPersonOrganizationProperty, (__bridge CFStringRef)@&OYue&, &error);//公司(组织)名称
ABRecordSetValue(person, kABPersonDepartmentProperty, (__bridge CFStringRef)@&DYue&, &error); //部门
ABRecordSetValue(person, kABPersonJobTitleProperty, (__bridge CFStringRef)@&JYue&, &error); //职位
添加联系人的邮件信息
/*添加联系人的邮件信息*/
//实例化多值属性
ABMultiValueRef emailMultiValue = ABMultiValueCreateMutable(kABMultiStringPropertyType);
//设置相关标志位
ABMultiValueIdentifier QQI//QQ
//进行赋值
//设置自定义的标签以及值
ABMultiValueAddValueAndLabel(emailMultiValue, (__bridge CFStringRef)@&&, (__bridge CFStringRef)@&QQ&, &QQIdentifier);
//添加属性
ABRecordSetValue(person, kABPersonEmailProperty, emailMultiValue, &error);
//释放资源
CFRelease(emailMultiValue);
添加联系人的地址信息
/*添加联系人的地址信息*/
//实例化多值属性
ABMultiValueRef addressMultiValue = ABMultiValueCreateMutable(kABMultiDictionaryPropertyType);
//设置相关标志位
ABMultiValueIdentifier AddressI
//初始化字典属性
CFMutableDictionaryRef addressDictionaryRef = CFDictionaryCreateMutable(kCFAllocatorSystemDefault, 0, NULL, NULL);
//进行添加
CFDictionaryAddValue(addressDictionaryRef, kABPersonAddressCountryKey, (__bridge CFStringRef)@&China&); //国家
CFDictionaryAddValue(addressDictionaryRef, kABPersonAddressCityKey, (__bridge CFStringRef)@&WeiFang&); //城市
CFDictionaryAddValue(addressDictionaryRef, kABPersonAddressStateKey, (__bridge CFStringRef)@&ShangDong&); //省(区)
CFDictionaryAddValue(addressDictionaryRef, kABPersonAddressStreetKey, (__bridge CFStringRef)@&Street&); //街道
CFDictionaryAddValue(addressDictionaryRef, kABPersonAddressZIPKey, (__bridge CFStringRef)@&261500&); //邮编
CFDictionaryAddValue(addressDictionaryRef, kABPersonAddressCountryCodeKey, (__bridge CFStringRef)@&ISO&); //ISO国家编码
//添加属性
ABMultiValueAddValueAndLabel(addressMultiValue, addressDictionaryRef, (__bridge CFStringRef)@&主要&, &AddressIdentifier);
ABRecordSetValue(person, kABPersonAddressProperty, addressMultiValue, &error);
//释放资源
CFRelease(addressMultiValue);
添加联系人的生日信息
//添加公历生日
ABRecordSetValue(person, kABPersonBirthdayProperty, (__bridge CFTypeRef)([NSDate date]), &error);
常用的属性如上,其他的属性在此也就不多余了,就是一堆代码的重复,但所有的用法在上面的实例中也都已经给出,只需按照方法用即可。
通过AddressBookUI.framwork实现
ABNewPersonViewController(添加联系人控制器)
顾名思义,它就是用来新增加联系人的控制器,样式就是系统通讯录下的样式,如下:
这里重点的介绍一下它的协议方法,感觉最管用的也就是这个协议方法:
* 新增联系人点击Cancel或者Done之后的回调方法
* @param newPersonView 调用该方法的ABNewPersonViewController对象
* @param person 传出的ABRecordRef属性
* 点击了Done,person就是新增的联系人属性
* 点击了Cancel,person就是NULL
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView
didCompleteWithNewPerson:(nullable ABRecordRef)
楼主程序的实例
#pragma mark -
- (void)newPersonViewController:(ABNewPersonViewController *)newPersonView didCompleteWithNewPerson:(nullable ABRecordRef)person
//表示取消了
if (person == NULL){
//Cancle coding..
//表示保存成功
//Cancle Done..
[self requestContacts];
//不管成功与否,都需要跳回,因为我是通过模态跳入,所以需要dismiss
[newPersonView dismissViewControllerAnimated:true completion:^{}];
ABUnknownPersonViewController(未知联系人的控制器)
这个控制器刚开始接触的时候,完全有点不懂它的用处,明明有了ABNewPersonViewController,怎么还需要这个,后来发现,它还是有他的作用的,这里先不给大家看图,先看一下初始化的代码:
//实例化一个person
ABRecordRef person = ABPersonCreate();
//设置姓名
ABRecordSetValue(person, kABPersonFirstNameProperty, (__bridge CFStringRef)@&firstName&, NULL);
//初始化未知联系人的控制器
ABUnknownPersonViewController * unknowPersonViewController = [[ABUnknownPersonViewController alloc]init];
//设置代理
unknowPersonViewController.unknownPersonViewDelegate =
//设置相关属性
unknowPersonViewController.alternateName = @&alternateName&;//替代名和姓的替代符
unknowPersonViewController.displayedPerson = //展示的person对象
unknowPersonViewController.message = @&message&; //存在替代符下面的信息
unknowPersonViewController.allowsActions = //是否允许作用(出现共享联系人等)
unknowPersonViewController.allowsAddingToAddressBook =//是否允许添加到通讯录(新建或添加到现有联系人)
//释放资源
CFRelease(person);
[self.navigationController pushViewController:unknowPersonViewController animated:true];
初始化代码如上,那么再来看一下效果图,从下图来看,它不只能够新增联系人,还可以补充现有的联系人:
最后介绍一下他的协议方法,说实话,他的协议方法通过文档看懂了,但是用起来很奇怪,来看一下它的协议:
* 当创建新的联系人或者更新到已存在的联系人时调用的方法
* @param unknownCardViewController 调用方法的ABUnknownPersonViewController对象
* @param person 创建或者更新的ABRecordRef属性
- (void)unknownPersonViewController:(ABUnknownPersonViewController *)unknownCardViewController
didResolveToPerson:(nullable ABRecordRef)
//根据页面选择的属性进行响应判断,与下面的ABPersonViewController协议方法相似
- (BOOL)unknownPersonViewController:(ABUnknownPersonViewController *)personViewController
shouldPerformDefaultActionForPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)
ABPersonViewController(详细信息的控制器)
这个控制器主要是用来显示联系人详细信息,不仅如此,还可以对联系人进行编辑,先上图来看看他的样式
它的的可设置属性如下:
//展示详情的Person
@property(nonatomic,readwrite) ABRecordRef displayedP
//是否允许编辑,如果设置为false,右上角的Edit按钮就会消失,默认为true
@property(nonatomic) BOOL allowsE
//是否允许响应,如果设置为false,下面&发送信息,共享联系人&选项就会消失,默认为true
@property(nonatomic) BOOL allowsA
//固定展示属性的key数组,只作用于浏览时,比如只想展示姓名,如果进入编辑状态,那么还是会全部展示出来
@property(nonatomic,copy,nullable) NSArray *displayedP
//是否显示链接人,默认为false
@property(nonatomic) BOOL shouldShowLinkedP
//设置属性的高亮项,如果属性值是单一的,后面的多值标识符将会被忽略
- (void)setHighlightedItemForProperty:(ABPropertyID)property
withIdentifier:(ABMultiValueIdentifier)
* 根据页面选择的属性进行响应判断
* @param personViewController 进行回调的ABPersonViewController对象
* @param person 展示的Person
* @param property 进行响应的属性
* @param identifier 如果是多值属性,返回多值属性
* @return 是否响应,true为按照系统默认方式响应,false为不响应
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)
下面是楼主的协议实例:
- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
//如果点击的是电话选项,不进行响应,就是在真机中,点击电话cell,不会相应拨打电话
if (property == kABPersonPhoneProperty)
ABPeoplePickerNavigationController(选择联系人的控制器)
是顾名思义的一个选择控制器,因为是导航控制器,所以这里我选择的使用模态跳,直接来看看效果图吧:
它的协议方法如下(备注:楼主用的Xcode版本号为7.3.1,并且没有下载iOS7.0的模拟环境,所以只能走iOS8.0之后的协议方法)
* 点击Cancle进行的回调
* @param peoplePicker 进行回调的ABPeoplePickerNavigationController
- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peopleP
//模态弹回
[peoplePicker dismissViewControllerAnimated:true completion:^{}];
* 选择了联系人之后进行何种操作的回调(iOS8.0之后由下面的方法替代)
* @param peoplePicker 进行回调的ABPeoplePickerNavigationController对象
* @param person 选择的Person
* @return true表示能够显示通讯录并dismiss掉选择器,false表示不做任何事
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person NS_DEPRECATED_(2_0, 8_0)
* 选择了联系人之后进行的回调(替代上面协议方法的方法,在iOS8.0之后可用)
* 或者用属性predicateForSelectionOfPerson来替代
* @param peoplePicker 进行回调的ABPeoplePickerNavigationController对象
* @param person 选择的Person
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker
didSelectPerson:(ABRecordRef)person
//coding record the person
//dismiss掉选择器
[peoplePicker dismissViewControllerAnimated:true completion:^{}];
* 选择了联系人之后选择属性时进行何种操作的回调(iOS8.0之后用下面的方法替代)
* (peoplePickerNavigationController:shouldContinueAfterSelectingPerson: 的详细版)
* @param peoplePicker 进行回调的ABPeoplePickerNavigationController对象
* @param person 选择的person对象
* @param property 选择的属性
* @param identifier 如果是多值,传出多值属性,单值属性时可以忽略
* @return true表示进行系统的默认操作并dismiss出选择器,false表示在当前选择器显示该联系人
- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier NS_DEPRECATED_IOS(2_0,8_0)
* 选择了联系人之后选择属性时进行何种操作的回调(替代上面协议方法的方法,在iOS8.0之后可用)
* 或者用属性predicateForSelectionOfProperty来替代
* @param peoplePicker 进行回调的ABPeoplePickerNavigationController对象
* @param person 选择的person对象
* @param property 选择的属性
* @param identifier 如果是多值,传出多值属性,单值属性时可以忽略
- (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker
didSelectPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
[peoplePicker dismissViewControllerAnimated:true completion:^{}];IOS开发之----通讯录访问授权
在早些时候,当iOS 6还没出来,我们访问通讯录只要如下简单的代码:
不过,这个API返回空值。苹果提供了如下API:
由于之前的iOS
版本在隐私方面被人诟病,以至于出现App在没有提醒用户的情况访问通讯录而被拒绝的案例。现在每个App要访问通讯录都应该得到用户的授权:
因此,如上注释所描述的,我们应该调用如下API来获取授权:
不过这只会在第一次请求授权时才显示对话框,如果用户已经拒绝了,我们可以判断下授权状态:
通过判断授权状态,我们可以再次提醒用户进行授权。
比较糟糕的是,在中文版上,访问通讯录会出现汉化错误,:
从上图中可以看到,微信还给了用户更为详细的信息,表示现在是要访问通讯录,而非日历。
于是,我在上面提到的代码中翻了几遍,都没找到设置alertView详细信息的地方,最后在SO上得到解答
——&通过在plist设置NSContactsUsageDescription关键字。详细文档。
调试经验分享:一般程序安装后,第一次会提示是否访问XXXX,再到二次的时候不管怎么它都不会提示,这样就不方便大家的调试了!
在设备里面还原后,它就会再次出现!
还原步棸:
设置--》通用--》还原--》还原位置与隐私
ok就可以了!
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。iOS编程之Address&Book(一)起步
iOS的地址簿技术提供一个在集中式数据库中存储用户联系人信息和其他私人信息、在应用程序间分享这些信息的方式。
地址簿技术包括四个方面:
Address Book framework提供接口来访问用户信息
Address Book UI framework 用来显示用户信息
Address Book databases 存储信息
Contacts application提供方式让用户来访问他们的联系信息
当你在你的应用程序中加入地址簿技术,用户将能够在你的应用程序中使用他们在其他应用程序中使用的联系人信息,例如邮件和文本。
按照下列步骤做:
1、访问用户地址簿数据库
2、提示用户要访问信息
3、显示联系人信息
4、修改用户地址簿数据库
要最大化的理解地址簿技术,应该先懂得navigation controller和view
controller以及委托和协议
注意:在Mac OS
X中的地址簿技术接口和iOS中的不一样
第一步:简单的开始
建立一个简单的应用程序来提示用户从自己的联系人列表里面选择一个人,然后显示选中的人的名字和电话号码
1、建立新项目----new project ----- Single View Application
2、链接Address Book UI和Address Book
frameworks到项目里&
注意:如果没有链接这些framework项目编译时将报错
3、创建UI和头文件
当你创建用户接口,你要利用XCode来声明必要的动作和属性,创建一些头文件
打开主storyboard文件(MainStoryboard.storyboard),添加一个按钮和两个标签,如下图排列(其实用一般的XIB也是一样的)
把按钮和view controller中的事件连接起来,事件名称为showPicker,再把两个标签和view
controller中相应的属性连接起来,属性名为firstName和phoneNumber
在头文件ViewController.h中,@interface最后要声明这个view
controller继承ABPeoplePickerNavigationControllerDelegate
方式是直接加上&ABPeoplePickerNavigationControllerDelegate&
#import &UIKit/UIKit.h&
#import &AddressBookUI/AddressBookUI.h&
@interface ViewController : UIViewController &ABPeoplePickerNavigationControllerDelegate&
@property (weak, nonatomic) IBOutlet UILabel *firstN
@property (weak, nonatomic) IBOutlet UILabel *phoneN
- (IBAction)showPicker:(id)
在.m文件中这样写
在showPicker方法中,创建了一个ABPeoplePickerNavigationController, 把view
controller作为Picker的delegate, 然后再把picker作为modal view
controller
- (IBAction)showPicker:(id)sender
ABPeoplePickerNavigationController *picker =
[[ABPeoplePickerNavigationController alloc] init];
picker.peoplePickerDelegate =
[self presentModalViewController:picker animated:YES];
这个picker在它自己的delegate里调用方法来相应用户的动作。
1.如果用户取消,则调用- (void)peoplePickerNavigationControllerDidCancel:
& 来dismiss这个picker
2.如果用户选择了地址簿里的一个人,则将调用
(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController
*)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
复制名字和号码放入标签中,然后再dismiss Picker
3.当用户点击picker中选中的人的一个属性,将调用
(BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController
*)peoplePicker & &
shouldContinueAfterSelectingPerson:(ABRecordRef)person&property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
在这个应用程序中,当用户选中一个人时,picker总是会dismiss,所以没办法让用户选中这个人的一个属性。这意味着这个方法将不再被调用。但是如果把这个方法排除在外,整个协议的实现方法又不完整。
- (void)peoplePickerNavigationControllerDidCancel:
(ABPeoplePickerNavigationController *)peoplePicker
[self dismissModalViewControllerAnimated:YES];
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person {
[self displayPerson:person];
[self dismissModalViewControllerAnimated:YES];
return NO;
- (BOOL)peoplePickerNavigationController:
(ABPeoplePickerNavigationController *)peoplePicker
shouldContinueAfterSelectingPerson:(ABRecordRef)person
property:(ABPropertyID)property
identifier:(ABMultiValueIdentifier)identifier
return NO;
如下图所示的
- (void)displayPerson:(ABRecordRef)person
用来显示名字和号码
注意:两者的代码是不同的
名字是string型的属性,记录中有名(first name)这个字段,这个也可能是NULL
电话号码是一个多值的属性,一个人可能有0、1或多个电话号码
本例中只用到列表中的第一个电话号码
- (void)displayPerson:(ABRecordRef)person
NSString* name = (__bridge_transfer NSString*)ABRecordCopyValue(person,
kABPersonFirstNameProperty);
self.firstName.text =
NSString* phone =
ABMultiValueRef phoneNumbers = ABRecordCopyValue(person,
kABPersonPhoneProperty);
if (ABMultiValueGetCount(phoneNumbers) & 0) {
phone = (__bridge_transfer NSString*)
ABMultiValueCopyValueAtIndex(phoneNumbers, 0);
phone = @"[None]";
self.phoneNumber.text =
然后运行程序
当你运行程序时看到的是一个按钮和两个空标签
点击一下按钮,弹出一个picker
然后你选择一个人,就能看到信息了
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。}

我要回帖

更多关于 ios instruments 使用 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信