2009-10-22 4 views
3

두 개의 Objective-C 클래스가 UIViewController에서 상속되며 iPhone의 주소록과 상호 작용하는 방법을 배우는 데있어 다른 접근 방식을 시도하고 있습니다. Apple이 제공하는 example은 모든 것이 하나의 클래스에 있다고 가정합니다. 그러나 이것이 필요한 방식은 아닙니다. 내 목표는 사람이 선택되면 주소록보기를 닫는 것입니다. 봐 주시고 CallerClass에 ABPeoplePickerNavigationControllerDelegate를 구현시키지 않고도이 작업을 수행 할 수있는 방법을 알려주십시오. 감사!Objective-C 주소록

- 편집 -

이 아래로 비등 할 것으로 보인다 무엇 인 [자기 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 
+0

. doIt 메서드에서 CalleeClass를 대리자로 설정하면 CallerClass는 이미 AB 대리자가 아닙니다. – pxl

+0

pxl, 나는 이것을 알고있다. 이를 달성하기위한 한 가지 해결책은 호출자 클래스의 모든 대리자 메서드를 래핑하고 호출 수신자를 완전히 없애는 것입니다.하지만 원하는 것은 아닙니다. 따라서 두 클래스를 사용하여 인스턴스를 만들고 액세스 할 수있는 솔루션을 찾고 있습니다. 주소록 항목.내가 말한 것은 "호출자를 대리인으로 지정하면됩니다.하지만 필요한 것은 호출 수신자가 대행자 일 것입니다. 여기서는 호출 수신자를 대리인으로 지정하고 작동하지 않게하는 방법이 있습니다. 내가 이것을 고쳐 줄까요? " 감사! –

답변

0

당신이 원하는 행동을 취한 후에는 int32 recordID를 전달할 수 있습니다. 단, API 문서에서 언급했듯이 recordID는 간단하기 때문에 composite 이름을 사용해야합니다. 값이 "1"로 시작하고 데이터베이스가 이전 레코드 ID 값의 새 연락처가있는 전화기로 복원 된 경우 문제가 발생할 수 있습니다. 주소록에서 뭔가를 액세스해야 할 때마다 전화 번호부를 만들어야하지만 바로 그 후에 전화 번호부를 닫을 수 있습니다. 따라서 recordID로 열어서 원하는 것을 얻은 다음 닫을 수 있습니다. 내 제안은 정상적인보기 컨트롤러와 같은 picker를 사용하여 recordID를 얻은 지점까지 피킹을 해제 한 다음 해당 식별자를 유지하는 것입니다. 새 recordID를 찾으려면 picker를 다시 사용하십시오. 당신이 '돈 때문에 dismissModalViewControllerAnimated:가 제시 뷰 컨트롤러에서 호출해야하기 때문에 당신이 말한대로 문제가 [self dismissModalViewControllerAnimated:YES]CalleeClass에서 호출하면 아무런 효과가 없다는 것을, 경우

+0

나는 그것에 행동하고있다 self.name = (NSString *) ABRecordCopyValue (person, kABPersonAddressProperty); 나는 그 일을 수행 한 다음에 주소록을 닫을 수 있기를 바랬다 : [self dismissModalViewControllerAnimated : YES]; 하지만 그럴 것 같지 않습니다. 이 게시물의 전체 의도는 정상 컨트롤러로 피커를 사용하지 않고 위의 패션으로 사용하는 것입니다. 기본적으로 한 번에 데이터를 추출해야하고 다시는 참조하지 않아야하므로 휴대용 식별자를 사용하면 걱정하지 않아도됩니다. –

1

이가 (즉, 하나는 당신이. presentModalViewController:Animated:라고 t이 CalleeClassCallerClass 인스턴스에 대한 참조를 가지고,이 작동하지 않습니다 다행히도

, 문서로 dismissModalViewControllerAnimated: 노트 :.

는하지만, 모달 뷰 컨트롤러 자체에이 메소드를 호출 할 경우, 모달 뷰 컨트롤러는 메시지를 상위 뷰 컨트롤러로 자동 전달합니다.

그래서이 작동합니다 : 당신이 요구하는지 지금 있는지 무엇을

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person { 
    self.name = (NSString *)ABRecordCopyValue(person,kABPersonAddressProperty); 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 
    return NO; 
}