iphone - 使用Cocoa Touch教程: Extract Address Book Address Values on iPhone OS

标签 iphone

我已经按照以下教程进行操作,在模拟器中效果很好,但是在我的手机上,当选择地址时,谷歌地图启动,我想我已经为此伤透了脑筋。我将其与 NavBarContolloer 结合使用任何帮助都会很棒。

摘自:Cocoa Touch 教程:在 iPhone 操作系统上提取通讯录地址值

代码如下:

#import "RootViewController.h"
#import "SecondViewController.h"
#import "ThirdViewController.h"
#import "FourthViewController.h"


@implementation ThirdViewController

@synthesize fourthViewController;
@synthesize firstName;
@synthesize lastName;
@synthesize addressLabel;

-(IBAction)switchPage:(id)sender
{
    if(self.fourthViewController == nil)
    {
        FourthViewController *fourthView = [[FourthViewController alloc]
                                          initWithNibName:@"FourthView" bundle:[NSBundle mainBundle]];
        self.fourthViewController = fourthView;
        [fourthView release];
    }

    [self.navigationController pushViewController:self.fourthViewController animated:YES];
}

-(IBAction)getContact {
    // creating the picker
    ABPeoplePickerNavigationController *picker = [[ABPeoplePickerNavigationController alloc] init];
    // place the delegate of the picker to the controll
    picker.peoplePickerDelegate = self;

    // showing the picker
    [self presentModalViewController:picker animated:YES];
    // releasing
    [picker release];
}

- (void)peoplePickerNavigationControllerDidCancel:(ABPeoplePickerNavigationController *)peoplePicker {
    // assigning control back to the main controller
    [self dismissModalViewControllerAnimated:YES];
}

- (BOOL)peoplePickerNavigationController: (ABPeoplePickerNavigationController *)peoplePicker shouldContinueAfterSelectingPerson:(ABRecordRef)person {

    // setting the first name
    firstName.text = (NSString *)ABRecordCopyValue(person, kABPersonFirstNameProperty);

    // setting the last name
    lastName.text = (NSString *)ABRecordCopyValue(person, kABPersonLastNameProperty);   

    // setting the street name
    //ABMultiValueRef street = ABRecordCopyValue(person, kABPersonAddressProperty);
    // street.text = (NSString *)ABRecordCopyValue(person, kABPersonAddressStreetKey);  

    // setting the number
    /*
     this function will set the first number it finds

     if you do not set a number for a contact it will probably
     crash
     */
    ABMultiValueRef multi = ABRecordCopyValue(person, kABPersonPhoneProperty);
    number.text = (NSString*)ABMultiValueCopyValueAtIndex(multi, 0);

    // remove the controller
    //[self dismissModalViewControllerAnimated:YES];

    return YES;
}

- (BOOL)peoplePickerNavigationController:(ABPeoplePickerNavigationController *)peoplePicker
      shouldContinueAfterSelectingPerson:(ABRecordRef)person
                                property:(ABPropertyID)property
                              identifier:(ABMultiValueIdentifier)identifier {
    // Only inspect the value if it's an address.
    if (property == kABPersonAddressProperty) {
        /*
         * Set up an ABMultiValue to hold the address values; copy from address
         * book record.
         */
        ABMultiValueRef multi = ABRecordCopyValue(person, property);

        // Set up an NSArray and copy the values in.
        NSArray *theArray = [(id)ABMultiValueCopyArrayOfAllValues(multi) autorelease];

        // Figure out which values we want and store the index.
        const NSUInteger theIndex = ABMultiValueGetIndexForIdentifier(multi, identifier);

        // Set up an NSDictionary to hold the contents of the array.
        NSDictionary *theDict = [theArray objectAtIndex:theIndex];

        // Set up NSStrings to hold keys and values.  First, how many are there?
        const NSUInteger theCount = [theDict count];
        NSString *keys[theCount];
        NSString *values[theCount];

        // Get the keys and values from the CFDictionary.  Note that because
        // we're using the "GetKeysAndValues" function, you don't need to
        // release keys or values.  It's the "Get Rule" and only applies to
        // CoreFoundation objects.
        [theDict getObjects:values andKeys:keys];

        // Set the address label's text.
        NSString *address;
        address = [NSString stringWithFormat:@"%@, %@, %@, %@ %@",
                   [theDict objectForKey:(NSString *)kABPersonAddressStreetKey],
                   [theDict objectForKey:(NSString *)kABPersonAddressCityKey],
                   [theDict objectForKey:(NSString *)kABPersonAddressStateKey],
                   [theDict objectForKey:(NSString *)kABPersonAddressZIPKey],
                   [theDict objectForKey:(NSString *)kABPersonAddressCountryKey]];

        self.addressLabel.text = address;

        // Memory management.
        [theDict release];

        // Return to the main view controller.
        [ self dismissModalViewControllerAnimated:YES ];
        // return Yes;
    }

    // If they didn't pick an address, return YES here to keep going.
    return YES;
}


/*
 // The designated initializer.  Override if you create the controller programmatically and want to perform customization that is not appropriate for viewDidLoad.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {
        // Custom initialization
    }
    return self;
}
*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView {
}
*/

/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad {
    [super viewDidLoad];
}
*/

/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
*/

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}


- (void)dealloc {
    [super dealloc];
}


@end

最佳答案

-[ABPeoplePickerNavigationControllerDelegate peoplePickerNavigationController:shouldContinueAfterSelectingPerson:property:identifier:]

您需要返回 NO 才能不启动 Google map 。返回 YES 将继续执行默认操作,即在设备上启动 Google map 。

关于iphone - 使用Cocoa Touch教程: Extract Address Book Address Values on iPhone OS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1994870/

相关文章:

iphone - iOS:本地化时设置应用程序的主要语言

ios - 一侧有阴影/边框和圆角的 iPhone UIButton

iphone - 如何从 UILabel 创建图像?

像优步一样的 iOS 实时位置跟踪器?

iPhone SDK 4.0 强制网络支持 - CNMarkPortalOnline 和 CNMarkPortalOffline - 作为接口(interface)名称参数传递的内容

Java IDE *在* iPhone 上?

iphone - 表格 View 单元格 附件类型 自定义位置的复选标记

iphone - 使用新的 SDK 在我的 Facebook 墙上发布

ios - 无法使用类型为 'indexOf' 的参数列表调用 '(ChecklistItem)'

ios - 使用 NIB 无法识别 UITableViewCell 中单击的单元格 UITableView