私はこの解決策をウェブで探していました。iPhone の Google マップ アプリケーションとまったく同じように、検索するとアドレス帳を調べて、探しているものの候補を見つけます。
これまでのところ、検索バーとマップビューを設定することができたので、正確な住所を検索すると地図に表示されます。
アドレス帳に住所を保存している可能性のあるユーザーが、それを使用して地図ビューで検索しやすくしたいと考えています。
検索ディスプレイ コントローラーとアドレス帳を使用する必要があることはわかっていますが、既定のテーブル ビュー以外に検索ディスプレイ コントローラーの例が見つかりません。
これは私がこれまでに持っているものです
編集。
誰も知らないと思います。しかし、それを理解するのに数日かかりました。
これを行う方法を学びたいすべての人のための解決策を次に示します。
ここで知っておくべき重要なことは、アドレス帳のデータを配列に取得する方法です。この配列を検索ディスプレイ コントローラーで使用してフィルター処理するだけです。
そこで、アドレス帳データを取得するために私が思いついた方法は次のとおりです。
- (void) getContactData
{
NSMutableDictionary *myAddressBook = [[NSMutableDictionary alloc] init];
self.names = [NSMutableArray array];
ABAddressBookRef addressBook = ABAddressBookCreate();
if (addressBook != nil){
NSLog(@"Successfully accessed the address book.");
NSArray *allPeople = (__bridge_transfer NSArray *) ABAddressBookCopyArrayOfAllPeople(addressBook);
NSString *address;
NSUInteger peopleCounter = 0;
for (peopleCounter = 0;
peopleCounter < [allPeople count]; peopleCounter++){
ABRecordRef thisPerson = (__bridge ABRecordRef)
[allPeople objectAtIndex:peopleCounter];
NSString *firstName = (__bridge_transfer NSString *) ABRecordCopyValue(thisPerson, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *) ABRecordCopyValue(thisPerson, kABPersonLastNameProperty);
NSString *company = (__bridge_transfer NSString *) ABRecordCopyValue(thisPerson, kABPersonOrganizationProperty);
ABMutableMultiValueRef multiValue = ABRecordCopyValue(thisPerson, kABPersonAddressProperty);
for(CFIndex i=0;i<ABMultiValueGetCount(multiValue);i++)
{
NSString* HomeLabel = (__bridge NSString*)ABMultiValueCopyLabelAtIndex(multiValue, i);
if([HomeLabel isEqualToString:@"_$!<Home>!$_"])
{
CFDictionaryRef dict = ABMultiValueCopyValueAtIndex(multiValue, i);
CFStringRef street = CFDictionaryGetValue(dict, kABPersonAddressStreetKey);
CFStringRef city = CFDictionaryGetValue(dict, kABPersonAddressCityKey);
CFStringRef state = CFDictionaryGetValue(dict, kABPersonAddressStateKey);
CFStringRef zip = CFDictionaryGetValue(dict, kABPersonAddressZIPKey);
CFRelease(dict);
if (zip == nil) {
address = [NSString stringWithFormat:@"%@, %@, %@ ", street, city, state];
}else {
address = [NSString stringWithFormat:@"%@, %@, %@ , %@", street, city, state, zip];
}
}
if ([address length] != 0) {
// [self.addresses insertObject:address atIndex:i];
[myAddressBook setObject:address forKey:@"Address"];
if ([firstName length] != 0 && [lastName length] != 0) {
NSString *name= [NSString stringWithFormat: @"%@ %@", firstName, lastName];
[myAddressBook setObject:name forKey:@"Name"];
// [names insertObject:name atIndex:i];
}
else if ([firstName length] != 0 && [lastName length] == 0) {
NSString *name= [NSString stringWithFormat: @"%@", firstName];
// [names insertObject:name atIndex:i];
[myAddressBook setObject:name forKey:@"Name"];
}
else if ([firstName length] == 0 && [lastName length] == 0) {
if ([company length] != 0) {
//[names insertObject:company atIndex:i];
[myAddressBook setObject:company forKey:@"Name"];
}
}
NSString *name = [myAddressBook objectForKey:@"Name"];
NSString *address = [myAddressBook objectForKey:@"Address"];
NSDictionary* personDict = [[NSDictionary alloc] initWithObjectsAndKeys:name,@"Name",address,@"Address",nil];
[self.names addObject:personDict];
}
}
}
CFRelease(addressBook);
}
}
// Setup SearchBar
UISearchBar *search = [[UISearchBar alloc] initWithFrame:CGRectMake(20, 0, 278, 44)];
search.delegate = self;
self.searchBar = search;
// Setup Map View
MKMapView *mapView = [[MKMapView alloc] initWithFrame:CGRectMake(20, 44, 278, 150)];
mapView.mapType = MKMapTypeStandard;
mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
self.myMapview = mapView;
[self.view addSubview:self.myMapview];
[self.view addSubview:self.searchBar];
- (void)searchBarSearchButtonClicked:(UISearchBar *)aSearchBar {
// When the search button is tapped, add the search term to recents and conduct the search.
NSString *searchString = [searchBar text];
self.eventLocationCoordinate = [self getLocationFromAddressString:searchString];
[self zoomMapAndCenterAtLatitude:self.eventLocationCoordinate.latitude andLongitude:self.eventLocationCoordinate.longitude];
[self setMapAnnotationAtCoordinate:self.eventLocationCoordinate withTitle:@"Your Here" andSubtitle:searchString];
}
楽しくコーディングしましょう!