Адресная книга Objective-C - PullRequest
       13

Адресная книга Objective-C

3 голосов
/ 22 октября 2009

У меня есть два класса Objective-C, которые наследуются от UIViewController, и я пытаюсь использовать другой подход к обучению взаимодействию с адресной книгой iPhone. пример Apple предполагает, что все в одном классе, но это не так, как мне нужно. Моя цель - закрыть представление адресной книги после выбора человека. Пожалуйста, посмотрите, и дайте мне знать, как я могу сделать это без CallerClass реализовать ABPeoplePickerNavigationControllerDelegate. Спасибо!

- редактировать -

То, к чему это сводится, - это [self dismissModalViewControllerAnimated: YES]; не имеет никакого эффекта в CalleeClass.m. Я все еще не могу получить реакцию на закрытие адресной книги от этой команды.

CallerClass.m

#import "CallerClass.h"

@implementation CallerClass
- (IBAction)openAddressBook {
    CalleeClass *cc = [[CalleeClass alloc] init];
    [self presentModalViewController:[cc doIt] animated:YES];
}

CalleeClass.h

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

@interface CalleeClass : UIViewController <ABPeoplePickerNavigationControllerDelegate> {
    NSString *name;
}

-(ABPeoplePickerNavigationController *)doIt;

@property (nontoxic, retain) NSString *name;

@end

CalleeClass.m

#import <UIKit/UIKit.h>
#import <AddressBook/AddressBook.h>
#import <AddressBookUI/AddressBookUI.h>
#import "CalleeClass.h"

@implementation CalleeClass
@synthesize name;

… (по умолчанию ABPeoplePickerNaviationControllerDelegate реализация вне того, что перечислено)

- (id)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {}
    return self;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    self.name = (NSString *)ABRecordCopyValue(person,kABPersonAddressProperty);

    [self dismissModalViewControllerAnimated:YES];
    return NO;  
}

-(ABPeoplePickerNavigationController *)doIt {
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    picker.peoplePickerDelegate = self;
    return picker;
}

@end

Ответы [ 2 ]

1 голос
/ 27 октября 2009

Если проблема, как вы говорите, в том, что [self dismissModalViewControllerAnimated:YES] не имеет никакого эффекта при вызове из CalleeClass, то это потому, что dismissModalViewControllerAnimated: должен быть вызван на текущем контроллере представления (то есть на том, на котором вы вызывали presentModalViewController:Animated:. Поскольку у вас нет ссылки на ваш экземпляр CallerClass в CalleeClass, это не сработает.

К счастью, в документации для dismissModalViewControllerAnimated: примечания:

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

Так что это должно работать:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {
    self.name = (NSString *)ABRecordCopyValue(person,kABPersonAddressProperty);
    [peoplePicker dismissModalViewControllerAnimated:YES];
    return NO;  
}
0 голосов
/ 23 октября 2009

После того, как вы определили контакт, с которым хотите работать, вы можете просто передать int32 recordID, хотя, как указано в документации по API, вам, вероятно, следует также использовать составное имя, поскольку, как вы заметите, recordID - это простое значение начинается с «1», и вы можете столкнуться с проблемами, если ваша база данных будет восстановлена ​​на телефоне с новыми контактами со старыми значениями recordID. Каждый раз, когда вам нужно получить доступ к чему-либо из адресной книги, вам нужно создать телефонную книгу, но вы можете сразу же закрыть ее, поэтому с помощью recordID вы можете открыть, получить то, что вы хотите, а затем закрыть его. Я предлагаю просто использовать средство выбора, как обычный контроллер представления, до точки, где вы получаете recordID, отклоняете его, а затем сохраняете этот уникальный идентификатор. Используйте Picker снова, когда вам нужно найти новый recordID.

...