2010-02-24 17 views
11

Tôi gần như tuyệt vọng khi tìm kiếm giải pháp trong vài tuần.iPhone ABPeoplePickerNavigationController - Cách chọn hai mục nhập duy nhất của hai thuộc tính đa giá trị khác nhau của một người từ AddressBook

Vấn đề rất đơn giản:

  • Qua ABPeoplePickerNavigationController (như là một ModalView), một người sẽ được chọn.
  • Chỉ sau đó (ví dụ) địa chỉ Mail sẽ được hiển thị và người dùng nên chọn một địa chỉ.
  • Sau khi chọn địa chỉ Thư chỉ (ví dụ:) số điện thoại sẽ được hiển thị và người dùng nên chọn một số.

Giải pháp cho đến các khía cạnh thứ ba là nổi tiếng:

- (IBAction)importFromAddressBook 
{ 
    ABPeoplePickerNavigationController* picker = [[ABPeoplePickerNavigationController alloc] init]; 
    picker.peoplePickerDelegate = self; 
    [self presentModalViewController:picker animated:YES]; 
    [picker release]; 
} 

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker 
{ 
    [self dismissModalViewControllerAnimated:YES]; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController*)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonEmailProperty]]]; 
    return YES; 
} 

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 
    //===PROBLEM=== Now I do have a mail address and I want to have a phone number right afterwards. 

    //Something like this would be straightforward, but the view does not change this way: 
    [peoplePicker setDisplayedProperties:[NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]]; 
    //Here misses the important code. 


    //And only when I also got a phone number through this or a similar method I want to call: 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 

    //I do not want to start default behaviour with the mailaddress and/or phone number: 
    return NO; 
} 

Cách tiếp cận đúng dường như đẩy một Xem peoplePicker tương tự trên NavigationController của ModalView, nhưng tôi không biết làm thế nào.

Nếu có ai có ý tưởng thì nó sẽ tuyệt vời!

Nếu bạn muốn xem hành vi như vậy, bạn có thể xem ứng dụng Amazon: Nếu bạn thực hiện các bước đầu tiên của đơn đặt hàng, bạn có thể chọn địa chỉ giao hàng theo cách này: Từ Danh sách liên hệ -> Chọn một người -> Chọn một địa chỉ -> Chọn một số điện thoại. Ở đó, mọi thứ (dường như) diễn ra trong chế độ xem phương thức chỉ với một hệ thống phân cấp điều hướng với một cấp độ cao hơn so với mã tiêu chuẩn được hiển thị ở trên.

Trả lời

1

Trong ứng dụng iPhone của tôi Pastie, tôi đã thực hiện một cách tiếp cận khác. alt text http://manicwave.com/images/pastie/contactdetails.png

Tôi sử dụng PeoplePicker để chọn người đó và sau đó mở trình chỉnh sửa liên hệ (người).

Đây chỉ là một cái nhìn đơn giản:

Tên người liên hệ Số điện thoại> mặc định là điện thoại đầu tiên số email Địa chỉ> mặc định là địa chỉ email đầu tiên

Mỗi số điện thoại và địa chỉ email mang đến cái nhìn khác hiển thị danh sách điện thoại hoặc địa chỉ email, với dấu kiểm bên cạnh danh sách hiện đang được chọn.

Tôi sử dụng chế độ xem này để thiết lập liên hệ ban đầu cũng như chỉnh sửa tiếp theo.

+0

Tôi rất tiếc nhưng tôi chưa trả lời! Nhận xét của bạn hướng dẫn tôi đến giải pháp gần như chính xác như một giải thưởng. Cảm ơn nhiều!! –

15

Tôi đoán đây có thể là những gì bạn muốn:

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker 
     shouldContinueAfterSelectingPerson:(ABRecordRef)person 
           property:(ABPropertyID)property 
           identifier:(ABMultiValueIdentifier)identifier 
{ 

    ABPersonViewController *controller = [[ABPersonViewController alloc] init]; 
    controller.displayedPerson = person; 
    controller.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]; 
    controller.personViewDelegate = self; 
    [peoplePicker pushViewController:controller animated:YES]; 
    [controller release]; 
    return NO; 
} 

- (BOOL)personViewController:(ABPersonViewController *)personViewController 
shouldPerformDefaultActionForPerson:(ABRecordRef)person 
        property:(ABPropertyID)property 
        identifier:(ABMultiValueIdentifier)identifierForValue 
{ 
    ABMutableMultiValueRef multi = ABRecordCopyValue(person, property); 
    CFStringRef phone = ABMultiValueCopyValueAtIndex(multi, identifierForValue); 
    NSLog(@"phone %@", (NSString *)phone); 
    CFRelease(phone); 

    ABPeoplePickerNavigationController *peoplePicker = (ABPeoplePickerNavigationController *)personViewController.navigationController; 
    [peoplePicker dismissModalViewControllerAnimated:YES]; 
    return NO; 
} 

Ý tưởng là, để tạo ra một ví dụ ABPersonViewController, và để mọi người chọn của bạn để đẩy nó, vì ABPeoplePickerNavigationController là một lớp con của NSPeoplePickerNavigationController.

+0

Tôi cũng muốn nói lời xin lỗi với bạn. Nó không phải là ý định của tôi không phản ứng. Đây chính xác là những gì tôi đã tìm kiếm! –

+0

Có lỗi trong mã - bạn KHÔNG nên sử dụng mã định danh làm chỉ mục trong dòng ABMultiValueCopyValueAtIndex (multi, identifierForValue). Chuyển đổi identiefier thành chỉ mục thuộc tính thông qua ABMultiValueGetIndexForIdentifier –

1

Trong câu trả lời gợi ý có một thông cáo thiếu

CFRelease (đa);

Nếu không có bản phát hành này, sự rò rỉ sẽ xảy ra. Hoặc ít nhất theo Xây dựng và Phân tích trong Xcode ....

1

Các phương pháp sau đây sẽ trả về NO:

- (BOOL)peoplePickerNavigationController: 
    (ABPeoplePickerNavigationController*)peoplePicker 
    shouldContinueAfterSelectingPerson:(ABRecordRef)person 
{ 
    ... 
    return NO; 
} 

này sẽ cho phép phương pháp tiếp theo của bạn được gọi là (peoplePickerNavigationController: shouldContinueAfterSelectingPerson: bất động sản: nhận dạng :).

Các vấn đề liên quan