2010-02-24 18 views
11

से किसी व्यक्ति के दो अलग-अलग बहुविकल्पीय गुणों की दो एकल प्रविष्टियों का चयन कैसे करें, क्योंकि मैं हफ्तों के लिए समाधान खोजने के लिए निराशाजनक हूं।आईफोन ABPeoplePickerNavigationController - पता पुस्तिका

समस्या सरल है:

    वाया ABPeoplePickerNavigationController
  • (एक ModalView के रूप में), एक व्यक्ति को चुना जाना चाहिए।
  • फिर केवल (उदा।) मेल पते दिखाए जाने चाहिए और उपयोगकर्ता को एक का चयन करना चाहिए।
  • मेल पते के चयन के बाद बस (उदा।) फोन नंबर दिखाना चाहिए और उपयोगकर्ता को एक का चयन करना चाहिए।

तीसरे पहलू जब तक समाधान अच्छी तरह से ज्ञात है:

- (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; 
} 

सही दृष्टिकोण ModalView की navigationController पर एक समान peoplePicker देखें पुश करने के लिए लगता है, लेकिन मैं कैसे पता नहीं है।

अगर कोई किसी भी विचार था यह बहुत अच्छा होगा!

यदि आप कार्रवाई में ऐसा व्यवहार देखना चाहते हैं तो आप अमेज़ॅन ऐप पर एक नज़र डाल सकते हैं: यदि आप ऑर्डर के पहले चरण में जाते हैं तो आप इस तरह से एक शिपिंग पता चुन सकते हैं: संपर्क सूची से -> चुनें एक व्यक्ति -> एक पता का चयन करें -> एक टेलीफोन नंबर का चयन करें। वहां, सब कुछ (लगता है) ऊपर दिखाए गए मानक कोड की तुलना में एक और स्तर के साथ केवल एक नेविगेशन पदानुक्रम के साथ मोडल व्यू में होता है।

उत्तर

1

अपने iPhone एप्लिकेशन pastie में, मैं एक अलग दृष्टिकोण लिया। alt text http://manicwave.com/images/pastie/contactdetails.png

मैं लोगों का चयन करने के लिए लोगों का उपयोग करता हूं और फिर एक संपर्क (व्यक्ति) संपादक खोलता हूं।

यह सिर्फ एक साधारण दृश्य है:

संपर्क नाम फ़ोन नंबर> चूक पहला फोन नंबर ईमेल पते पर> पहले ईमेल पते

को चूक फोन नंबर और ईमेल पते से प्रत्येक एक और दृश्य को लाने के वर्तमान में चुने गए एक के बगल में एक चेक मार्क के साथ फोन या ईमेल पते की सूची दिखा रहा है।

मैं एक संपर्क के प्रारंभिक सेटअप के साथ ही बाद में संपादन के लिए इस दृश्य का उपयोग।

+0

मुझे खेद है कि मैंने अभी तक जवाब नहीं दिया है! आपकी टिप्पणी ने मुझे समाधान के लिए निर्देशित किया जो लगभग ज़ोनबल की तरह बिल्कुल था। आपका बहुत बहुत धन्यवाद!! –

15

मुझे लगता है कि यह हो सकता है कि आप क्या चाहते:

- (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; 
} 

विचार है, एक और ABPersonViewController उदाहरण बनाने के लिए, और अपने लोगों पिकर यह पुश करने के लिए करते हैं, के बाद से ABPeoplePickerNavigationController NSPeoplePickerNavigationController का एक उपवर्ग है।

+0

मैं भी आपको माफी चाहता हूं। प्रतिक्रिया करने के लिए मेरा इरादा नहीं था। यह वही था जो मैंने खोजा था! –

+0

कोड में एक त्रुटि है - आपको पहचानकर्ता को लाइन ABBultiValueCopyValueAtIndex (बहु, पहचानकर्ताफॉरवेल्यू) में इंडेक्स के रूप में उपयोग नहीं करना चाहिए। ABMultiValueGetIndexForIdentifier के माध्यम से पहचानकर्ता को एक संपत्ति अनुक्रमणिका में कनवर्ट करें –

1

सुझाव दिया जवाब में एक विज्ञप्ति जारी की याद आ रही

CFRelease (बहु) है;

इस रिलीज के बिना एक रिसाव होगा। या कम से कम एक्सकोड में बिल्ड और विश्लेषण के अनुसार ....

1

निम्न विधि नहीं लौटना चाहिए: shouldContinueAfterSelectingPerson: संपत्ति: पहचानकर्ता :)

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

यह आपके अगली विधि के नाम से जाना (peoplePickerNavigationController की अनुमति देगा।