연락처 앱과 같은 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 것입니다.
ABAccountsAndGroupsViewController 및 ABMembersViewController는 AddressBookUI의 공개 API 아니다, 그래서 나는 (I 인쇄 밖으로 자신의 이름으로 그들에게있어) 직접 액세스 할 수 없습니다. 그래서 viewControllers의 수를 확인합니다. 그래서 내 첫 번째 질문은 애플이 공개 API를 사용하지 않는 이유는 무엇입니까?
두 번째 질문은 ABPersonViewController (사례 3)에 관한 것입니다. ABNewPersonViewController 인 경우 해당 navigationItem에 "취소"및 "완료" UIBarButtonItem이 올바르게 표시 될 수 있습니다. 나는 아무것도 할 필요가 없다.
그러나 ABPersonViewController 인 경우 "취소"UIBarButtonItem은 여전히 단추 대신 yesByButtonItem으로 표시됩니다 (심지어 allowEditing을 YES로 설정 했음). 그래서 저는 그것을 수동으로 설정해야합니다. 그러나 왜? 그것을 할 수있는 더 좋은 방법이 있습니까?
그리고 Contact App처럼 ABPeoplePickerNavigationController를 만들기 위해 여기에 작성한 코드보다 더 좋은 방법이 있습니까?
감사합니다.
하나 개 더 질문은 질문하는 것을 잊었다 : 사용자가 ABPersonViewController에서 사람 속성을 선택하면,이 개 장소가있다 사용자가 조치를 취하도록 허용할지 여부를 결정하는 코드를 추가 할 수 있습니다. 먼저 그것은 ABPersonViewControllerDelegate의 메소드입니다. ** shouldPerformDefaultActionForPerson ** 두 번째 ABPeoplePickerNavigationControllerDelegate 메소드 ** shouldContinueAfterSelectingPerson **입니다. 그렇다면 그 차이점은 무엇입니까? 어느 것이 더 낫습니다. – Qiulang