2014-11-15 3 views
1

이있다 이상한 행동은 8 내 시나리오는IOS 8 : IOS의 주소록에서 연락처를 액세스하는 동안 ABPeoplePickerNavigationController 사람들 선택기 대리자 메서드를 구현하는 해고는

  1. 표시 연락처 테이블
  2. 행을 선택 간단 발견 즉 didSelectPerson 방법에 didSelectPerson 방법
  3. 를 호출
  4. 푸시 SecondViewController

    ,174,
    - (void)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker didSelectPerson:(ABRecordRef)person; 
    { 
        SecondViewController *detailVC = [[SecondViewController alloc] initWithNibName:@"SecondViewController" bundle:nil]; 
        [detailVC.view setBackgroundColor: [UIColor redColor]]; 
        // [peoplePicker.navigationController pushViewController:detailVC animated:YES]; 
        [peoplePicker pushViewController:detailVC animated:YES]; 
    } 
    

그러나 ABPeoplePickerNavigationController가 종료되면 어떻게됩니까? 제발 이걸 가르쳐주세요.

+0

도출 할 수 없으며 똑같은 문제가 있습니다. ^^ 빈 메소드이지만, 호출자가 선택하는 즉시 피커가 해제됩니다. –

답변

0

나는 "didSelectPerson"방법의 두건에서 무슨 일이 일어나는 지 철학적 인 일을 모르지만, 오늘 나는 똑같은 문제에 직면했다. 은 "ABPeoplePickerNavigationController"의 방법 - ": (BOOL) 플래그 완료 (무효 (^) (무효)) 완료를 (무효) dismissViewControllerAnimated "나는 내가 를 오버라이드 (override)이 문제를 극복하기 위해 간단한 해결책을 찾아 냈다. 그리고 다소 "didSelectPerson"내부에 다음

bool dismissedEnabled; -(void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion { if (dismissedEnabled) { [super dismissViewControllerAnimated:flag completion:completion]; } } 

를 다음과 같이 그것을 구현 나는이 나를 위해 작동

viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:[NSBundle mainBundle]]; 

    dismissedEnabled = false; 
    [self presentViewController:viewController animated:YES completion:nil]; 

을, 다음은 너희들이 너무 그것을 극복 희망 :)

+0

이 작업을 수행하기 위해 ABPeoplePickerNavigationController를 하위 클래스로 만들었고 제대로 작동했습니다. 그러나 Apple의 의사는 "ABPeoplePickerNavigationController 클래스는 서브 클래 싱을 지원하지 않습니다." Apple이 귀하의 앱을 거부 했습니까? – user523234

+0

지금까지는 ABPeoplePickerNavigationController의 하위 클래스로 인해 거부되지 않았습니다. 거부되거나 의심 스러울 경우 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html에 설명 된 카테고리 기능을 사용하여이 메소드를 무시할 수 있습니다. –

+0

뭔가를 간과했습니다. 아주 간단합니다 : http://stackoverflow.com/questions/30354402/the-abpeoplepickernavigationcontroller-class-does-not-support-subclassing – user523234

0

했을 예를 들어 하나의 이메일 주소로 연락처를 선택하면 자동으로 닫힙니다. 연락처에 둘 이상의 전자 메일이있는 경우 ABPeoplePickerNavigationController가 ABPersonViewController를 스택에 강제로 적용하도록하는 조건자를 지정해야합니다.

if ([picker respondsToSelector:@selector(setPredicateForSelectionOfPerson:)]) 
    { 
     // The people picker will select a person that has exactly one email address and call peoplePickerNavigationController:didSelectPerson:, 
     // otherwise the people picker will present an ABPersonViewController for the user to pick one of the email addresses. 
     picker.predicateForSelectionOfPerson = [NSPredicate predicateWithFormat:@"[email protected] = 1"]; 
    } 
0

나는 아이폰 OS 8의 기본 동작은 didSelectPerson가 호출 될 때 ABPeoplePickerNavigationController가 자동으로 해제 할 것을 믿습니다. 당신이 ABPeoplePickerNavigationController이 기각되는 동안 SecondViewController을 밀어하려고하기 때문에

SecondViewController가 (나는이 문제의 증상이 있음을 추론하고있어)가 표시되지 않는 이유입니다. 이 겹치는 애니메이션은 iOS 코어 뷰 관리/애니메이션 시스템이 피하려고하는 문제입니다.

이 경우 콘솔에 경고가 표시 될 수 있습니다.

@ Ratul의 솔루션은이 기본 동작을 우회하기 때문에 작동합니다.

내 경우에 코드는 UIAlertControllerdidSelectPerson에서 제시하기 전에 잠자기 상태입니다. 이것은 1 초도 안되는 해고 애니메이션 ABPeoplePickerNavigationController에 달려있는 해킹입니다. 나에게이 경고가 표시되지 않으면 누구도 이것이 문제라는 것을 알지 못합니다.

좀 더 강력한 기능을 원할 경우 viewDidAppear을 덮어 쓰면이 특별한 경우를 처리 할 수 ​​있습니다 (현재보기 컨트롤러에서 플래그 사용). 그러나 이것은 조금 어색해집니다.

관련 문제