0

연락처 앱과 같은 ABPeoplePickerNavigationController 작업을 만들고 너무 복잡하다고 생각하고 있습니다. 나는 그것이 잘못했기 때문에 이것이 확실한 지 아닌지 확신하지 못합니다.ABPeoplePickerNavigationController가 연락처 앱처럼 작동하도록하려면 복잡해야합니까?

첫 번째 작업은 오른쪽 바 버튼에서 취소 버튼을 제거하는 것입니다. 다음 코드는 작동하지 않습니다! I 한동안 혼란스러워

picker.navigationItem.rightBarButtonItem = nil; 

는 취소 rightBarButtonItem ABPeoplePickerNavigationController가 포함 된 하위 뷰 예컨대 속하는 때문임을 발견 ABPersonViewController,하지만 ABPeoplePickerNavigationController 자체는 아닙니다! 그리고 이것이 이유입니다. 그것을 확인하는 것은 쉽고, picker.navigationItem.rightBarButtonItem을 인쇄하면, 항상 nil입니다.

그래서 나는 peoplePickerDelegate가 아닌 ABPeoplePickerNavigationController.delegate를 구현합니다. 그러나 그것을 구현하는 데는 몇 가지 트릭이 필요했고 그게 내 질문이었습니다. 첫째

그래서 코드 :

#pragma mark UINavigationControllerDelegate methods 
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    switch ([navigationController.viewControllers count]) { 
     case 1: 
      viewController.navigationItem.rightBarButtonItem = nil; 
      break; 
     case 2: { 
      UIBarButtonItem *addButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addButtonClicked)]; 
      [viewController.navigationItem setRightBarButtonItem:addButtonItem animated:NO]; 
      [addButtonItem release]; 
      break; 
     } 
     case 3: { 
      UIBarButtonItem *editButtonItem; 
      if ([viewController isKindOfClass:[ABPersonViewController class]]) {  

       editButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(editButtonClicked:)]; 
       self.personView = (ABPersonViewController*) viewController; 
       self.personView.allowsEditing = YES; 
       [viewController.navigationItem setRightBarButtonItem:editButtonItem animated:NO]; 
       [editButtonItem release]; 

      } else { 
       //ABPersonNewViewController 
       //No need to add codes here 
      }    
      break; 
     }   
     default: {   
      UIBarButtonItem *cancelButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(addButtonClicked)]; 
      [viewController.navigationItem setRightBarButtonItem:cancelButtonItem animated:NO]; 
      [cancelButtonItem release]; 
      break; 
     } 
    } 
} 

여기에 첫 번째 이상한 것은 ABPeoplePickerNavigationController은 여기에 1 또는 2 파단, 사례 1과 사례 2를 포함 할 때의 ViewController 각각 ABAccountsAndGroupsViewController, ABMembersViewController 것입니다.

ABAccountsAndGroupsViewControllerABMembersViewController는 AddressBookUI의 공개 API 아니다, 그래서 나는 (I 인쇄 밖으로 자신의 이름으로 그들에게있어) 직접 액세스 할 수 없습니다. 그래서 viewControllers의 수를 확인합니다. 그래서 내 첫 번째 질문은 애플이 공개 API를 사용하지 않는 이유는 무엇입니까?

두 번째 질문은 ABPersonViewController (사례 3)에 관한 것입니다. ABNewPersonViewController 인 경우 해당 navigationItem에 "취소"및 "완료" UIBarButtonItem이 올바르게 표시 될 수 있습니다. 나는 아무것도 할 필요가 없다.

그러나 ABPersonViewController 인 경우 "취소"UIBarButtonItem은 여전히 ​​ 단추 대신 yesByButtonItem으로 표시됩니다 (심지어 allowEditing을 YES로 설정 했음). 그래서 저는 그것을 수동으로 설정해야합니다. 그러나 왜? 그것을 할 수있는 더 좋은 방법이 있습니까?

그리고 Contact App처럼 ABPeoplePickerNavigationController를 만들기 위해 여기에 작성한 코드보다 더 좋은 방법이 있습니까?

감사합니다.

+0

하나 개 더 질문은 질문하는 것을 잊었다 : 사용자가 ABPersonViewController에서 사람 속성을 선택하면,이 개 장소가있다 사용자가 조치를 취하도록 허용할지 여부를 결정하는 코드를 추가 할 수 있습니다. 먼저 그것은 ABPersonViewControllerDelegate의 메소드입니다. ** shouldPerformDefaultActionForPerson ** 두 번째 ABPeoplePickerNavigationControllerDelegate 메소드 ** shouldContinueAfterSelectingPerson **입니다. 그렇다면 그 차이점은 무엇입니까? 어느 것이 더 낫습니다. – Qiulang

답변

0

iOS 5로 업그레이드 한 후 코드를 수정해야합니다. ABPeoplePickerNavigationController가 ABAccountsAndGroupsViewController (사례 1)를 표시하면 왼쪽에있는 새로 고침 표시 줄 단추가됩니다. Exchange 서버에서 연락처를 동기화하는 데 사용되는지 또는 어떤 작업이 트리거 될지 확실하지 않습니다.

하지만 기본 버튼을 내 새로 고침 버튼으로 대체하면 내 작업이 호출되지 않습니다! 그리고 나는 그것이 ABAccountsAndGroupsViewController에게만 발생한다는 것을 알았고, 다른 경우는 여전히 작동합니다!

그래서 내 코드에서 iOS 5에서 작동하도록, 내가 구현 대리자 메서드 에있는 didShowViewController은하지 willShowViewController

관련 문제