2015-11-20 3 views
0

Я работаю над iOS Приложение, в котором у меня есть add контактов в Address Book.Как открыть Редактировать контакты Экран для конкретного контакта

Я хочу открыть Edit Экран контактов Всякий раз, когда пользователь пытается добавить duplicate контакт.

Но я не знаю, как это сделать. В настоящее время я могу только показать сообщение.

Я получаю весь список контактов, как:

NSArray *allContacts = (__bridge NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBookRef); 

Тогда я itterating через него и проверить существующие one.If он существует, то я показываю сообщение еще я добавлю его в адресную книгу.

 for (id record in allContacts){ 
    ABRecordRef thisContact = (__bridge ABRecordRef)record; 
    if (CFStringCompare(ABRecordCopyCompositeName(thisContact), 
         ABRecordCopyCompositeName(pet), 0) == kCFCompareEqualTo){ 
     //The contact already exists! 
     NSLog(@"contact exosts"); 
    } 
    else 
    { 
     ABAddressBookAddRecord(addressBookRef, pet, nil); 
     ABAddressBookSave(addressBookRef, nil); 
      ABMultiValueAddValueAndLabel(phoneNumbers, (__bridge CFStringRef)petPhoneNumber, kABPersonPhoneMainLabel, NULL); 
     NSLog(@"contacts Added"); 
    } 
} 

Как я могу открыть следующий экран, когда пользователь пытается добавить дубликат контакта:

enter image description here

я искал SO и найти следующие вопросы, но это не помогает мне. Question 1 Question 2

А можно ли сделать так или not.Please любому помочь мне достичь этой функции, если это возможно.

ответ

2

Смотрите здесь .h

#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 

@interface ContactsViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, ABPersonViewControllerDelegate> 
{ 
    IBOutlet UITableView *tblContacts; 
    NSMutableArray *arrContacts; 
} 
@end 

И .m

#import "ContactsViewController.h" 

@interface ContactsViewController() 
{ 
    UIAlertController *action; 
} 
@end 

@implementation ContactsViewController 

#pragma mark - View lifecycle 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.title = @"Contacts"; 
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addNewContact:)]; 
    [self getContactsUsingAddressbook]; 
} 

#pragma mark - Methods 

// ------- Deprecated (in iOS 9.0) ---------- 
- (void)getContactsUsingAddressbook 
{ 
    ABAuthorizationStatus status = ABAddressBookGetAuthorizationStatus(); 

    if (status == kABAuthorizationStatusDenied || status == kABAuthorizationStatusRestricted) 
    { 
     UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:@"This app previously was refused permissions to contacts; Please go to settings and grant permission to this app so it can use contacts" preferredStyle:UIAlertControllerStyleAlert]; 
     [alert addAction:[UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]]; 
     [self presentViewController:alert animated:TRUE completion:nil]; 
     return; 
    } 
    CFErrorRef error = NULL; 
    ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error); 

    if (!addressBook) 
    { 
     NSLog(@"ABAddressBookCreateWithOptions error: %@", CFBridgingRelease(error)); 
     return; 
    } 
    ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { 

     if (error) 
     { 
      NSLog(@"ABAddressBookRequestAccessWithCompletion error: %@", CFBridgingRelease(error)); 
     } 
     if (granted) 
     { 
      NSArray *allPeople = CFBridgingRelease(ABAddressBookCopyArrayOfAllPeople(addressBook)); 
      arrContacts = [NSMutableArray arrayWithArray:allPeople]; 
      [tblContacts reloadData]; 
     } 
     else 
     { 
      dispatch_async(dispatch_get_main_queue(), ^{ 

       [[[UIAlertView alloc] initWithTitle:nil message:@"This app requires access to your contacts to function properly. Please visit to the \"Privacy\" section in the iPhone Settings app." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show]; 
      }); 
     } 
     CFRelease(addressBook); 
    }); 
} 

#pragma mark - Tableview delegate 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return arrContacts.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; 
    //if (cell == nil) 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cell"]; 
    cell.accessoryType = UITableViewCellAccessoryDetailButton; 

    // ------- Deprecated (in iOS 9.0) ---------- 
    ABRecordRef person = (__bridge ABRecordRef)arrContacts[indexPath.row]; 
    NSString *firstName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonFirstNameProperty)); 
    NSString *lastName = CFBridgingRelease(ABRecordCopyValue(person, kABPersonLastNameProperty)); 
    cell.textLabel.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // ------- Deprecated (in iOS 9.0) ---------- 
    ABPersonViewController *personController = [[ABPersonViewController alloc] init]; 
    personController.personViewDelegate = self; 
    personController.displayedPerson = (__bridge ABRecordRef)arrContacts[indexPath.row]; 
    personController.allowsEditing = YES; 
    personController.allowsActions = YES; 
    [self.navigationController pushViewController:personController animated:TRUE]; 
} 

#pragma mark - ABPersonview delegate 

- (BOOL)personViewController:(ABPersonViewController *)personViewController shouldPerformDefaultActionForPerson:(ABRecordRef)person property:(ABPropertyID)property identifier:(ABMultiValueIdentifier)identifier 
{ 
    return TRUE; 
} 

И увидеть в my simulator

+0

Hello @cuteAngel ... Thnx тонна для ваших усилий .. ваш код работает отлично .. но когда я нажмите на любой контакт, он показывает мне еще один экран, на котором есть контактные данные .. и после нажатия правой кнопки мыши я перенаправлен на страницу редактирования ... и на странице редактирования, когда я нажимаю кнопку отмены, ничего не происходит ... ANd - это любой способ, которым я могу прямо перейти на страницу редактирования ... – Dalvik

1

Вы можете редактировать контакт следующим

Здесь вы должны добавить

// ------- Deprecated (in iOS 9.0) 

#import <AddressBook/AddressBook.h> 
#import <AddressBookUI/AddressBookUI.h> 

ABPersonViewController *personController = [[ABPersonViewController alloc] init]; 
personController.personViewDelegate = self; 
personController.displayedPerson = (__bridge ABRecordRef)arrContacts[indexPath.row]; 
personController.allowsEditing = YES; 
personController.allowsActions = YES; 
[self.navigationController pushViewController:personController animated:TRUE]; 

А вот

#import <Contacts/Contacts.h> 
#import <ContactsUI/ContactsUI.h> 

// -------- This is not working for me, I got error 
CNContact *contact = [arrContacts objectAtIndex:indexPath.row]; 
NSArray *keys = @[CNContactIdentifierKey, CNContactEmailAddressesKey, CNContactBirthdayKey, CNContactImageDataKey, CNContactPhoneNumbersKey, [CNContactFormatter descriptorForRequiredKeysForStyle:CNContactFormatterStyleFullName]]; 
CNContactViewController *contactController = [CNContactViewController viewControllerForContact:contact]; 
contactController.delegate = self; 
contactController.allowsEditing = YES; 
contactController.allowsActions = YES; 
contactController.displayedPropertyKeys = keys; 
[self.navigationController pushViewController:contactController animated:TRUE]; 

Смотрите здесь Contact is missing some of the required key descriptors in ios

Но до сих пор я не нашел решение, Если у вас есть, пожалуйста, скажите мне

+0

позвольте мне попробовать это ... arrContacts [indexPath.row] это индекс контакта отредактировать? – Dalvik

+0

Должен ли я реализовать оба метода или любой из них? – Dalvik

+0

Любой из них, в зависимости от версии iOS. Если вы ориентируетесь как на iOS 8.0, так и на iOS 9.0, то реализуйте их как условным образом – VRAwesome