iOS通讯录

1.使用UITableView,实现联系人字母排序、点击字母跳转显示联系人组目录;

2.使用UISearchController,实现联系搜索,动态显示符合查询的联系人;

3.点击通讯录列表项,显示联系人信息(使用自定义模式化窗口类似与UIAlertView,使用UIwindow实现),点击拨号,可以直接拨打电话;

4.实现获取手机通讯录里面的联系人信息;

详情见资源:http://download.csdn.net/detail/u011622479/9505751

效果图如下:

获取联系人:

iOS通讯录_第1张图片           

搜索页:


                    iOS通讯录_第2张图片     


联系人信息:


iOS通讯录_第3张图片


主要显示页面代码:

[java] view plain copy
  1. //  
  2. //  ViewController.m  
  3. //  ContactionView  
  4. //  
  5. //  Created by rong xiang on 16/4/26.  
  6. //  Copyright © 2016年 hzz. All rights reserved.  
  7. //  
  8.   
  9. #import "ViewController.h"  
  10. #import <AddressBook/AddressBook.h>  
  11. #import "MobileAddressBook.h"  
  12. #import "ChineseString.h"  
  13. #import "CustomAlertView.h"  
  14. #import "MyButton.h"  
  15.   
  16. @interface ViewController (){  
  17.     NSMutableArray * listSection;  
  18.     NSMutableArray * addressBookTemp;  
  19.     NSMutableArray * listPhone;  
  20.     NSMutableArray *_searchContacts;//符合条件的搜索联系人  
  21.     CustomAlertView * alertView;  
  22.       
  23.     UITableView *tableViewAddress;  
  24.     UISearchBar * _searchBar;  
  25.     UISearchDisplayController *_searchDisplayController;  
  26. }  
  27.   
  28. @end  
  29.   
  30. @implementation ViewController  
  31.   
  32. -(void) loadView{  
  33.     [super loadView];  
  34.       
  35.     tableViewAddress = [[UITableView alloc] initWithFrame:CGRectMake(020, self.view.frame.size.width, self.view.frame.size.height - 20)];  
  36.     [tableViewAddress setBackgroundColor:[UIColor colorWithRed:250.0f/255.0f green:250.0f/255.0f blue:250.0f/255.0f alpha:1.0]];  
  37.     [tableViewAddress setSeparatorStyle:UITableViewCellSeparatorStyleNone];  
  38.     [self.view addSubview:tableViewAddress];  
  39.       
  40.        [self addSearchBar];  
  41.   
  42. }  
  43.   
  44. - (void)viewDidLoad {  
  45.     [super viewDidLoad];  
  46.       
  47.     //初始化显示对象  
  48.     addressBookTemp = [[NSMutableArray alloc] init];  
  49.     listSection = [[NSMutableArray alloc] init];  
  50.     listPhone =[[NSMutableArray alloc] init];  
  51.     NSMutableArray * listPhoneShow = [[NSMutableArray alloc] init];  
  52.       
  53.     tableViewAddress.delegate = self;  
  54.     tableViewAddress.dataSource = self;  
  55.     //获取通讯录联系人信息  
  56.     [self getAddressBook];  
  57.     //测试下的:初始化列表数据  
  58.     [self initData];  
  59.     //获取通讯录列表首字母,并排序  
  60.     listSection = [ChineseString IndexArray:addressBookTemp];  
  61.     //获取通讯录,并把通讯录对象按照首字母进行分组排序  
  62.     listPhoneShow = [ChineseString LetterSortArray:addressBookTemp];  
  63.     //把对应的同一个首字母下联系人对象按照首字母排序列表进行分组;  
  64.     NSInteger count = [listPhoneShow count];  
  65.     NSArray * array = nil;  
  66.       
  67.       
  68.     for(int i =0;i<count;i++){  
  69.           
  70.         array =[listPhoneShow objectAtIndex:i];  
  71.           
  72.         NSInteger arrCount = [array count];  
  73.         NSMutableArray * showArr = [[NSMutableArray alloc] init];  
  74.           
  75.         for(int j =0;j< arrCount;j++){  
  76.               
  77.             NSString *tempStr = [array objectAtIndex:j];  
  78.               
  79.             for(MobileAddressBook * add in addressBookTemp){  
  80.                   
  81.                 if([[add name] isEqualToString:tempStr]){  
  82.                     add.firstName = [listSection objectAtIndex:i];  
  83.                     [showArr addObject:add];  
  84.                     break;  
  85.                 }  
  86.                   
  87.             }  
  88.               
  89.         }  
  90.         [listPhone addObject:showArr];  
  91.     }  
  92.   
  93. }  
  94.   
  95. -(void) dealloc{  
  96.       
  97.     tableViewAddress.dataSource = nil;  
  98.     tableViewAddress.delegate = nil;  
  99.       
  100. }  
  101.   
  102. - (void)didReceiveMemoryWarning {  
  103.     [super didReceiveMemoryWarning];  
  104.     // Dispose of any resources that can be recreated.  
  105. }  
  106.   
  107. #pragma mark 搜索形成新数据  
  108. -(void)searchDataWithKeyWord:(NSString *)keyWord{  
  109.     //_isSearching=YES;  
  110.     _searchContacts=[NSMutableArray array];  
  111.       
  112.   int count =  [listPhone count];  
  113.     int arrCount = 0;  
  114.     NSArray * arr  = nil;  
  115.     MobileAddressBook * contact = nil;  
  116.     //过滤  
  117.     for(int i=0;i<count;i++){  
  118.         arr = [listPhone objectAtIndex:i];  
  119.         arrCount = arr.count;  
  120.           
  121.         for(int j=0;j<arrCount;j++){  
  122.             contact = [arr objectAtIndex:j];  
  123.             if ([contact.firstName.uppercaseString containsString:keyWord.uppercaseString]||[contact.name.uppercaseString containsString:keyWord.uppercaseString]||[contact.tel containsString:keyWord]) {  
  124.                 [_searchContacts addObject:contact];  
  125.             }  
  126.               
  127.         }  
  128.     }  
  129.       
  130. //    [listPhone enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {  
  131. //        NSArray * arr =obj;  
  132. //        [arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {  
  133. //            MobileAddressBook * contact = obj;  
  134. //            if ([contact.firstName.uppercaseString containsString:keyWord.uppercaseString]||[contact.name.uppercaseString containsString:keyWord.uppercaseString]||[contact.tel containsString:keyWord]) {  
  135. //                [_searchContacts addObject:contact];  
  136. //            }  
  137. //        }];  
  138. //    }];  
  139. }  
  140.   
  141. #pragma mark 添加搜索栏  
  142. -(void)addSearchBar{  
  143.       
  144.     _searchBar=[[UISearchBar alloc]init];  
  145.     [_searchBar sizeToFit];//大小自适应容器  
  146.     _searchBar.placeholder=@"搜索联系人";  
  147.     _searchBar.autocapitalizationType=UITextAutocapitalizationTypeNone;  
  148.     _searchBar.showsSearchResultsButton = YES;  
  149.       
  150.     //添加搜索框到页眉位置  
  151.     _searchBar.delegate=self;  
  152.     tableViewAddress.tableHeaderView=_searchBar;  
  153.       
  154.     _searchDisplayController=[[UISearchDisplayController alloc]initWithSearchBar:_searchBar contentsController:self];  
  155.     _searchDisplayController.delegate=self;  
  156.     _searchDisplayController.searchResultsDataSource=self;  
  157.     _searchDisplayController.searchResultsDelegate=self;  
  158.     _searchDisplayController.searchResultsTitle=@"没有符合的联系人";  
  159.     [_searchDisplayController setActive:NO animated:YES];  
  160.       
  161. }  
  162.   
  163.   
  164. // 选择完成,跳转回去  
  165. -(void) searchBarCancelButtonClicked:(UISearchBar *)searchBar{  
  166.     [tableViewAddress reloadData];  
  167. }  
  168.   
  169. -(void) searchBarResultsListButtonClicked:(UISearchBar *)searchBar{  
  170.     [tableViewAddress reloadData];  
  171. }  
  172.   
  173. #pragma  选择/全选/确定/返回/获取手机通讯录  
  174. -(void) goBack  
  175. {  
  176.     [self.navigationController popViewControllerAnimated:NO];  
  177. }  
  178.   
  179.   
  180. #pragma --获取手机通讯录  
  181.   
  182. -(void) getAddressBook{  
  183.       
  184.     //新建一个通讯录类  
  185.     ABAddressBookRef addressBooks = nil;  
  186.       
  187.     if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0)  
  188.           
  189.     {  
  190.         addressBooks =  ABAddressBookCreateWithOptions(NULL, NULL);  
  191.           
  192.         //获取通讯录权限  
  193.           
  194.         dispatch_semaphore_t sema = dispatch_semaphore_create(0);  
  195.           
  196.         ABAddressBookRequestAccessWithCompletion(addressBooks, ^(bool granted, CFErrorRef error){dispatch_semaphore_signal(sema);});  
  197.           
  198.         dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER);  
  199.           
  200.         //        dispatch_release(sema);  
  201.     }  
  202.       
  203.     else  
  204.           
  205.     {  
  206.         addressBooks = ABAddressBookCreate();  
  207.           
  208.     }  
  209.       
  210.     //获取通讯录中的所有人  
  211.     CFArrayRef allPeople = ABAddressBookCopyArrayOfAllPeople(addressBooks);  
  212.     //通讯录中人数  
  213.     CFIndex nPeople = ABAddressBookGetPersonCount(addressBooks);  
  214.       
  215.     //循环,获取每个人的个人信息  
  216.     for (NSInteger i = 0; i < nPeople; i++)  
  217.     {  
  218.         //新建一个addressBook model类  
  219.         MobileAddressBook *addressBook = [[MobileAddressBook alloc] init];  
  220.         //获取个人  
  221.         ABRecordRef person = CFArrayGetValueAtIndex(allPeople, i);  
  222.         //获取个人名字  
  223.         CFTypeRef abName = ABRecordCopyValue(person, kABPersonFirstNameProperty);  
  224.         CFTypeRef abLastName = ABRecordCopyValue(person, kABPersonLastNameProperty);  
  225.         CFStringRef abFullName = ABRecordCopyCompositeName(person);  
  226.         NSString *nameString = (__bridge NSString *)abName;  
  227.         NSString *lastNameString = (__bridge NSString *)abLastName;  
  228.           
  229.         if ((__bridge id)abFullName != nil) {  
  230.             nameString = (__bridge NSString *)abFullName;  
  231.         } else {  
  232.             if ((__bridge id)abLastName != nil)  
  233.             {  
  234.                 nameString = [NSString stringWithFormat:@"%@ %@", nameString, lastNameString];  
  235.             }  
  236.         }  
  237.         addressBook.name = nameString;  
  238.         addressBook.recordID = (int)ABRecordGetRecordID(person);;  
  239.           
  240.         ABPropertyID multiProperties[] = {  
  241.             kABPersonPhoneProperty,  
  242.             kABPersonEmailProperty  
  243.         };  
  244.         NSInteger multiPropertiesTotal = sizeof(multiProperties) / sizeof(ABPropertyID);  
  245.         for (NSInteger j = 0; j < multiPropertiesTotal; j++) {  
  246.             ABPropertyID property = multiProperties[j];  
  247.             ABMultiValueRef valuesRef = ABRecordCopyValue(person, property);  
  248.             NSInteger valuesCount = 0;  
  249.             if (valuesRef != nil) valuesCount = ABMultiValueGetCount(valuesRef);  
  250.               
  251.             if (valuesCount == 0) {  
  252.                 CFRelease(valuesRef);  
  253.                 continue;  
  254.             }  
  255.             //获取电话号码和email  
  256.             for (NSInteger k = 0; k < valuesCount; k++) {  
  257.                 CFTypeRef value = ABMultiValueCopyValueAtIndex(valuesRef, k);  
  258.                 switch (j) {  
  259.                     case 0: {// Phone number  
  260.                         addressBook.tel = [(__bridge NSString*)value stringByReplacingOccurrencesOfString:@"-" withString:@""];  
  261.                         addressBook.tel = [addressBook.tel stringByReplacingOccurrencesOfString:@" " withString:@""];  
  262.                         addressBook.tel = [addressBook.tel stringByReplacingOccurrencesOfString:@"+86" withString:@""];  
  263.                         break;  
  264.                     }  
  265.                     case 1: {// Email  
  266.                         addressBook.email = (__bridge NSString*)value;  
  267.                         break;  
  268.                     }  
  269.                 }  
  270.                 CFRelease(value);  
  271.             }  
  272.             CFRelease(valuesRef);  
  273.         }  
  274.         //将个人信息添加到数组中,循环完成后addressBookTemp中包含所有联系人的信息  
  275.         if(addressBook.tel.length != 11 ||addressBook.tel==nil||[addressBook.tel isEqual:@""]||[[addressBook.tel substringToIndex:3] isEqualToString:@"028"])  
  276.             continue;  
  277.           
  278.         [addressBookTemp addObject:addressBook];  
  279.           
  280.         if (abName) CFRelease(abName);  
  281.         if (abLastName) CFRelease(abLastName);  
  282.         if (abFullName) CFRelease(abFullName);  
  283.     }  
  284. }  
  285.   
  286. -(void) initData{  
  287.     MobileAddressBook * mab= [[MobileAddressBook alloc] init];  
  288.     [mab setRecordID:1];  
  289.     [mab setSectionNumber:0];  
  290.     [mab setTel:@"15281008411"];  
  291.     [mab setEmail:@""];  
  292.     [mab setName:@"胡玉铉"];  
  293.       
  294.     [addressBookTemp addObject:mab];  
  295.       
  296.       
  297.     mab= [[MobileAddressBook alloc] init];  
  298.     [mab setRecordID:1];  
  299.     [mab setSectionNumber:0];  
  300.     [mab setTel:@"15281008411"];  
  301.     [mab setEmail:@""];  
  302.     [mab setName:@"hu铉"];  
  303.       
  304.     [addressBookTemp addObject:mab];  
  305.       
  306.     mab= [[MobileAddressBook alloc] init];  
  307.     [mab setRecordID:2];  
  308.     [mab setSectionNumber:0];  
  309.     [mab setTel:@"15281008411"];  
  310.     [mab setEmail:@""];  
  311.     [mab setName:@"幸运星"];  
  312.       
  313.     [addressBookTemp addObject:mab];  
  314.       
  315.     mab= [[MobileAddressBook alloc] init];  
  316.     [mab setRecordID:1];  
  317.     [mab setSectionNumber:0];  
  318.     [mab setTel:@"15281008411"];  
  319.     [mab setEmail:@""];  
  320.     [mab setName:@"夏铉"];  
  321.       
  322.     [addressBookTemp addObject:mab];  
  323.       
  324.     mab= [[MobileAddressBook alloc] init];  
  325.     [mab setRecordID:1];  
  326.     [mab setSectionNumber:0];  
  327.     [mab setTel:@"15281008411"];  
  328.     [mab setEmail:@""];  
  329.     [mab setName:@"胡玉铉"];  
  330.       
  331.     [addressBookTemp addObject:mab];  
  332.       
  333.     mab= [[MobileAddressBook alloc] init];  
  334.     [mab setRecordID:2];  
  335.     [mab setSectionNumber:0];  
  336.     [mab setTel:@"15281008411"];  
  337.     [mab setEmail:@""];  
  338.     [mab setName:@"斐雨雪"];  
  339.       
  340.     [addressBookTemp addObject:mab];  
  341.       
  342.     mab= [[MobileAddressBook alloc] init];  
  343.     [mab setRecordID:2];  
  344.     [mab setSectionNumber:0];  
  345.     [mab setTel:@"15281008411"];  
  346.     [mab setEmail:@""];  
  347.     [mab setName:@"爱惜月"];  
  348.       
  349.     [addressBookTemp addObject:mab];  
  350.       
  351.     mab= [[MobileAddressBook alloc] init];  
  352.     [mab setRecordID:2];  
  353.     [mab setSectionNumber:0];  
  354.     [mab setTel:@"15281008411"];  
  355.     [mab setEmail:@""];  
  356.     [mab setName:@"希"];  
  357.       
  358.     [addressBookTemp addObject:mab];  
  359.       
  360.     mab= [[MobileAddressBook alloc] init];  
  361.     [mab setRecordID:1];  
  362.     [mab setSectionNumber:0];  
  363.     [mab setTel:@"15281008411"];  
  364.     [mab setEmail:@""];  
  365.     [mab setName:@"薛"];  
  366.       
  367.     [addressBookTemp addObject:mab];  
  368.       
  369.     mab= [[MobileAddressBook alloc] init];  
  370.     [mab setRecordID:1];  
  371.     [mab setSectionNumber:0];  
  372.     [mab setTel:@"15281008411"];  
  373.     [mab setEmail:@""];  
  374.     [mab setName:@"陈铉"];  
  375.       
  376.     [addressBookTemp addObject:mab];  
  377.       
  378.     mab= [[MobileAddressBook alloc] init];  
  379.     [mab setRecordID:1];  
  380.     [mab setSectionNumber:0];  
  381.     [mab setTel:@"15281008411"];  
  382.     [mab setEmail:@""];  
  383.     [mab setName:@"陈玉"];  
  384.       
  385.     [addressBookTemp addObject:mab];  
  386.       
  387.     mab= [[MobileAddressBook alloc] init];  
  388.     [mab setRecordID:1];  
  389.     [mab setSectionNumber:0];  
  390.     [mab setTel:@"15281008411"];  
  391.     [mab setEmail:@""];  
  392.     [mab setName:@"陈雪月"];  
  393.       
  394.     [addressBookTemp addObject:mab];  
  395.       
  396.     mab= [[MobileAddressBook alloc] init];  
  397.     [mab setRecordID:2];  
  398.     [mab setSectionNumber:0];  
  399.     [mab setTel:@"15281008411"];  
  400.     [mab setEmail:@""];  
  401.     [mab setName:@"陈婷"];  
  402.       
  403.     [addressBookTemp addObject:mab];  
  404.       
  405.     mab= [[MobileAddressBook alloc] init];  
  406.     [mab setRecordID:2];  
  407.     [mab setSectionNumber:0];  
  408.     [mab setTel:@"15281008411"];  
  409.     [mab setEmail:@""];  
  410.     [mab setName:@"Wien 吃"];  
  411.       
  412.     [addressBookTemp addObject:mab];  
  413.       
  414.     mab= [[MobileAddressBook alloc] init];  
  415.     [mab setRecordID:1];  
  416.     [mab setSectionNumber:0];  
  417.     [mab setTel:@"15281008411"];  
  418.     [mab setEmail:@""];  
  419.     [mab setName:@"wx"];  
  420.       
  421.     [addressBookTemp addObject:mab];  
  422.       
  423.     mab= [[MobileAddressBook alloc] init];  
  424.     [mab setRecordID:1];  
  425.     [mab setSectionNumber:0];  
  426.     [mab setTel:@"15281008411"];  
  427.     [mab setEmail:@""];  
  428.     [mab setName:@"文娱x"];  
  429.       
  430.     [addressBookTemp addObject:mab];  
  431.       
  432.       
  433.     mab= [[MobileAddressBook alloc] init];  
  434.     [mab setRecordID:2];  
  435.     [mab setSectionNumber:0];  
  436.     [mab setTel:@"15281008411"];  
  437.     [mab setEmail:@""];  
  438.     [mab setName:@"张运出"];  
  439.       
  440.     [addressBookTemp addObject:mab];  
  441.       
  442.     mab= [[MobileAddressBook alloc] init];  
  443.     [mab setRecordID:2];  
  444.     [mab setSectionNumber:0];  
  445.     [mab setTel:@"15281008411"];  
  446.     [mab setEmail:@""];  
  447.     [mab setName:@"#12443"];  
  448.       
  449.     [addressBookTemp addObject:mab];  
  450.   
  451. }  
  452.   
  453. #pragma --list 视图  
  454.   
  455. -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView  
  456. {  
  457.     if (tableView==self.searchDisplayController.searchResultsTableView) {  
  458.         return 1;  
  459.     }  
  460.       
  461.     return [listSection count];  
  462. }  
  463.   
  464. -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
  465. {  
  466.     //如果当前是UISearchDisplayController内部的tableView则使用搜索数据  
  467.     if (tableView==self.searchDisplayController.searchResultsTableView) {  
  468.         return _searchContacts.count;  
  469.     }  
  470.       
  471.     return [[listPhone  objectAtIndex:section] count];  
  472. }  
  473.   
  474. -(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{  
  475.       
  476.       
  477.     if (tableView==self.searchDisplayController.searchResultsTableView) {  
  478.         return @"搜索结果";  
  479.     }  
  480.       
  481.     NSString *title = [listSection objectAtIndex:section];  
  482.       
  483.     return title;  
  484. }  
  485.   
  486. -(NSArray *) sectionIndexTitlesForTableView:(UITableView *) tableView{  
  487.       
  488.     if (tableView==self.searchDisplayController.searchResultsTableView) {  
  489.         return [[NSArray alloc] init];  
  490.     }  
  491.       
  492.     return listSection;  
  493. }  
  494.   
  495. -(CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{  
  496.       
  497.     if(section ==0)  
  498.         return 35;  
  499.       
  500.     return 30;  
  501. }  
  502.   
  503. -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{  
  504.     return 50;  
  505. }  
  506.   
  507. - (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
  508. {  
  509.     //    组图标  
  510.     UIImageView * imgHeader = nil;  
  511.     //    联系人名称  
  512.     UILabel * lblName = nil;  
  513.     //    号码  
  514.     UILabel * lblPhone = nil;  
  515.       
  516.     UIView * border = nil;  
  517.       
  518.     static NSString *CellIndentifier = @"phone";  
  519.       
  520.     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIndentifier];  
  521.       
  522.     if(cell == nil)  
  523.     {  
  524.         cell = [[UITableViewCell alloc] init];  
  525.         [cell setRestorationIdentifier:CellIndentifier];  
  526.         [cell setSelectionStyle:UITableViewCellSelectionStyleNone];  
  527.         [cell.contentView setBackgroundColor:tableViewAddress.backgroundColor];  
  528.           
  529.         imgHeader = [[UIImageView alloc] initWithFrame:CGRectMake(5, (cell.contentView.frame.size.height-40)/24040)];  
  530.         [imgHeader setImage:[UIImage imageNamed:@"head_default4.jpg"]];  
  531.         imgHeader.tag = 99;  
  532.         [cell.contentView addSubview:imgHeader];  
  533.           
  534.         lblName = [[UILabel alloc] initWithFrame:CGRectMake(imgHeader.frame.origin.x + imgHeader.frame.size.width +105, cell.contentView.frame.size.width -imgHeader.frame.origin.x - imgHeader.frame.size.width*2 - 1521)];  
  535.         [lblName setFont:[UIFont systemFontOfSize:14.0f]];  
  536.         lblName.tag = 97;  
  537.         [cell.contentView addSubview:lblName];  
  538.           
  539.         lblPhone = [[UILabel alloc] initWithFrame:CGRectMake(imgHeader.frame.origin.x + imgHeader.frame.size.width +1022, cell.contentView.frame.size.width -imgHeader.frame.origin.x - imgHeader.frame.size.width*2 - 1521)];  
  540.         [lblPhone setFont:[UIFont systemFontOfSize:14.0f]];  
  541.         lblPhone.tag = 96;  
  542.         [cell.contentView addSubview:lblPhone];  
  543.           
  544.         border =[[UIView alloc] initWithFrame:CGRectMake(10, cell.frame.size.height - 1, cell.frame.size.width-351)];  
  545.         [border setBackgroundColor:[UIColor colorWithRed:200.0f/255.0f green:200.0f/255.0f blue:200.0f/255.0f alpha:1.0]];  
  546.         border.tag = 95;  
  547.         [cell.contentView addSubview:border];  
  548.     }  
  549.     else {  
  550.   
  551.         imgHeader = (UIImageView *)[cell.contentView viewWithTag:99];  
  552.         lblName = (UILabel *)[cell.contentView viewWithTag:97];  
  553.         lblPhone =(UILabel *)[cell.contentView viewWithTag:96];  
  554.         border = (UIView*)[cell.contentView viewWithTag:95];  
  555.     }  
  556.       
  557.     MobileAddressBook * address=nil;  
  558.       
  559.     // 如果显示通讯录列表  
  560.     if(tableView!=self.searchDisplayController.searchResultsTableView){  
  561.         address = [[listPhone objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];  
  562.     NSInteger arrayCount = [[listPhone objectAtIndex:indexPath.section] count];  
  563.       
  564.     if(arrayCount<=1 || indexPath.row==arrayCount-1)  
  565.         [border setHidden:YES];  
  566.     else  
  567.         [border setHidden:NO];  
  568.     }else{  
  569.         //如果显示搜索列表  
  570.         address = [_searchContacts objectAtIndex:indexPath.row];  
  571.     }  
  572.       
  573.     [lblName setText:address.name];  
  574.     [lblPhone setText:address.tel];  
  575.       
  576.     return cell;  
  577.       
  578. }  
  579.   
  580. -(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{  
  581.     //显示联系人详情  
  582.     MobileAddressBook * mab = nil;  
  583.     BOOL isSearch = NO;  
  584.       
  585.     if(tableView == _searchDisplayController.searchResultsTableView){  
  586.         mab = [_searchContacts objectAtIndex:indexPath.row];  
  587.         isSearch = YES;  
  588.     }else{  
  589.         mab = [[listPhone objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];  
  590.         isSearch = NO;  
  591.     }  
  592.       
  593.     //弹出框,显示联系人信息  
  594.     UIView * subView = [[UIView alloc] initWithFrame:CGRectMake(00300100)];  
  595.     [subView setBackgroundColor:[UIColor whiteColor]];  
  596.     subView.center = CGPointMake((self.view.frame.size.width)/2, (self.view.frame.size.height-subView.frame.size.height)/2);  
  597.     //添加头像  
  598.     UIImageView * imgView = [[UIImageView alloc] initWithFrame:CGRectMake(1784545)];  
  599.     [imgView setImage:[UIImage imageNamed:@"headerimage"]];  
  600.     [subView addSubview:imgView];  
  601.     //添加姓名  
  602.     UILabel * lblName =[[UILabel alloc] initWithFrame:CGRectMake(681910021)];  
  603.     [lblName setFont:[UIFont systemFontOfSize:15.0f]];  
  604.     [lblName setText:mab.name];  
  605.     [subView addSubview:lblName];  
  606.     //添加“电话”标题  
  607.     UILabel * lblTitle = [[UILabel alloc] initWithFrame:CGRectMake(20566821)];  
  608.     [lblTitle setText:@"电话"];  
  609.     [lblTitle setFont:[UIFont systemFontOfSize:12.0f]];  
  610.     [lblTitle setTextColor:[UIColor grayColor]];  
  611.     [subView addSubview:lblTitle];  
  612.     //添加电话号码显示  
  613.     UILabel * lblPhoneNo = [[UILabel alloc] initWithFrame:CGRectMake(177210021)];  
  614.     [lblPhoneNo setText:mab.tel];  
  615.     [lblPhoneNo setFont:[UIFont systemFontOfSize:14.0f]];  
  616.     [subView addSubview:lblPhoneNo];  
  617.     //添加按钮  
  618.     MyButton * btn = [[MyButton alloc] initWithFrame:CGRectMake(170705221)];  
  619.     [btn setTitle:@"拨号" forState:UIControlStateNormal];  
  620.     [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];  
  621.     [btn addTarget:self action:@selector(Call:) forControlEvents:UIControlEventTouchUpInside];  
  622.     NSMutableDictionary * dic = [[NSMutableDictionary alloc] init];  
  623. //    [dic setValue:isSearch?@"YES":@"NO" forKey:@"isSearch"];  
  624. //    [dic setValue:indexPath forKey:@"IndexPath"];  
  625.       
  626.     [dic setValue:mab forKey:@"Object"];  
  627.     [btn setObjectDic:dic];  
  628.     [subView addSubview:btn];  
  629.       
  630.      btn = [[MyButton alloc] initWithFrame:CGRectMake(240705221)];  
  631.     [btn setTitle:@"取消" forState:UIControlStateNormal];  
  632.     [btn setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];  
  633.     [btn addTarget:self action:@selector(Cancel:) forControlEvents:UIControlEventTouchUpInside];  
  634.     [subView addSubview:btn];  
  635.       
  636.     if(alertView != nil){  
  637.         [alertView setHidden:NO];  
  638.         [alertView.subviews[0] removeFromSuperview];  
  639.     }else  
  640.         alertView  = [[CustomAlertView alloc] init];  
  641.       
  642.     alertView.subView = subView;  
  643.     [alertView initView];  
  644.     [alertView show];  
  645. }  
  646. //拨打电话  
  647. -(void)  Call:(id) sender{  
  648.       
  649.     MyButton * btn = sender;  
  650.       
  651.     [alertView dismiss];  
  652.     [alertView setHidden:YES];  
  653.       
  654.     MobileAddressBook * addressBook = nil;  
  655.     addressBook = [btn.ObjectDic objectForKey:@"Object"];  
  656.       
  657. //    NSIndexPath * indexPath = nil;  
  658. //    BOOL isSearch = NO;  
  659. //    NSMutableDictionary * dic = [btn ObjectDic];  
  660. //    //获取联系人对象  
  661. //    isSearch = [[dic objectForKey:@"isSearch"] isEqualToString:@"YES"];  
  662. //    indexPath = [dic objectForKey:@"IndexPath"];  
  663. //      
  664. //    if(isSearch){  
  665. //        addressBook = [_searchContacts objectAtIndex:indexPath.row];  
  666. //    }else  
  667. //        addressBook = [[listPhone objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];  
  668.       
  669.     NSMutableString * str=[[NSMutableString alloc] initWithFormat:@"tel:%@", addressBook.tel];  
  670.     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:str]];  
  671. }  
  672.   
  673. -(void) Cancel:(id) sender{  
  674.     [alertView dismiss];  
  675.     [alertView setHidden:YES];  
  676. }  
  677.   
  678. #pragma mark - UISearchDisplayController代理方法  
  679. -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{  
  680.     [self searchDataWithKeyWord:searchString];  
  681.     return YES;  
  682. }  
  683.   
  684.   
  685. #pragma mark 重写状态样式方法  
  686. -(UIStatusBarStyle)preferredStatusBarStyle{  
  687.     return UIStatusBarStyleLightContent;  
  688. }  
  689.   
  690. #pragma mark 选中之前  
  691. -(NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath{  
  692.     [_searchBar resignFirstResponder];//退出键盘  
  693.     return indexPath;  
  694. }  
  695.   
  696.   
  697.   
  698. @end  

自定义alertview代码:
[java] view plain copy
  1. //  
  2. //  CustomAlertView.h  
  3. //  ContactionView  
  4. //  
  5. //  Created by rong xiang on 16/4/28.  
  6. //  Copyright © 2016年 hzz. All rights reserved.  
  7. //  
  8.   
  9. #import <UIKit/UIKit.h>  
  10.   
  11. @interface CustomAlertView : UIWindow  
  12. @property (nonatomic,retain) UIView * subView;  
  13.   
  14. // 显示  
  15. -(void) show;  
  16. //消失  
  17. -(void) dismiss;  
  18. -(void) initView;  
  19.   
  20. @end  

操作文件:
[java] view plain copy
  1. //  
  2. //  CustomAlertView.m  
  3. //  ContactionView  
  4. //  
  5. //  Created by rong xiang on 16/4/28.  
  6. //  Copyright © 2016年 hzz. All rights reserved.  
  7. //  
  8.   
  9. #import "CustomAlertView.h"  
  10.   
  11. @implementation CustomAlertView  
  12. @synthesize subView;  
  13.   
  14. -(id) initWithFrame:(CGRect)frame{  
  15.     self = [super initWithFrame:frame];  
  16.     if(self){  
  17.         self.windowLevel = UIWindowLevelAlert;  
  18.         //这里,不能设置UIWindow的alpha属性,会影响里面的子view的透明度,这里可以用透明图片来设置背影半透明  
  19.         self.backgroundColor = [UIColor colorWithPatternImage:[UIImage  
  20.                                                                imageNamed:@"transparent"]];  
  21.     }  
  22.       
  23. //    if(subView==nil){  
  24. //        subView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 80)];  
  25. //        subView.backgroundColor = [UIColor lightGrayColor];  
  26. //        subView.center = CGPointMake(160, 240);  
  27. //    }  
  28. //    [self addSubview:subView];  
  29.       
  30.     return self;  
  31. }  
  32.   
  33. -(void) initView{  
  34.     [self addSubview:subView];  
  35.       
  36.     self.backgroundColor = [UIColor colorWithPatternImage:[UIImage  
  37.                                                            imageNamed:@"transparent"]];  
  38. }  
  39.   
  40.   
  41. -(void)show{  
  42.     [self makeKeyAndVisible];  
  43. }  
  44.   
  45. -(void) dismiss{  
  46.     [self resignKeyWindow];  
  47. }  
  48.   
  49. //点击消失  
  50. -(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  
  51. //    [self dismiss];  
  52. }  
  53.   
  54. -(void) touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  
  55.       
  56. }  
  57.   
  58. -(void) touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{  
  59.       
  60. }  
  61.   
  62. @end  

联系人对象:
[java] view plain copy
  1. //  
  2. //  MobileAddressBook.h  
  3. //  ContactionView  
  4. //  
  5. //  Created by rong xiang on 16/4/26.  
  6. //  Copyright © 2016年 hzz. All rights reserved.  
  7. //  
  8.   
  9. #import <Foundation/Foundation.h>  
  10.   
  11. @interface MobileAddressBook : NSObject  
  12.   
  13. @property NSInteger sectionNumber;  
  14. @property NSInteger recordID;  
  15. @property (nonatomic, retain) NSString *name;  
  16. @property (nonatomic,retain) NSString * firstName;  
  17. @property (nonatomic, retain) NSString *email;  
  18. @property (nonatomic, retain) NSString *tel;  
  19. @end  

操作文件
[java] view plain copy
  1. //  
  2. //  MobileAddressBook.m  
  3. //  ContactionView  
  4. //  
  5. //  Created by rong xiang on 16/4/26.  
  6. //  Copyright © 2016年 hzz. All rights reserved.  
  7. //  
  8.   
  9. #import "MobileAddressBook.h"  
  10.   
  11. @implementation MobileAddressBook  
  12. @synthesize recordID,sectionNumber,name,tel,email,firstName;  
  13. @end 

你可能感兴趣的:(ios,通讯录,深度学习)