1

基本的に、検索リクエストがピックアップするすべての「ウォルマート」に注釈を付ける方法が必要です。インターフェイス ビルダーは使用していません。このアプリのコードを使用しているだけです。

MKMapView * map = [[MKMapView alloc] initWithFrame:
                   CGRectMake(0, 0, 320, 480)];
map.delegate = self;
[self.view addSubview:map];
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.



MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
request.naturalLanguageQuery = @"Walmart";
request.region = map.region;
4

2 に答える 2

1

でマップビューを作成することをお勧めしviewDidLoadます:

- (void)viewDidLoad
{
    [super viewDidLoad];

    MKMapView * map = [[MKMapView alloc] initWithFrame:self.view.bounds];
    map.delegate = self;

    [self.view addSubview:map];
}

ただし、ユーザーがマップを移動するときは、Walmarts を探して注釈を追加します。

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated
{
    // if on slow network, it's useful to keep track of the previous
    // search, and cancel it if it still exists

    [self.previousSearch cancel];

    // create new search request

    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc] init];
    request.naturalLanguageQuery = @"Walmart";
    request.region = mapView.region;

    // initiate new search

    MKLocalSearch *localSearch = [[MKLocalSearch alloc] initWithRequest:request];
    [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error) {

        NSMutableArray *annotations = [NSMutableArray array];

        [response.mapItems enumerateObjectsUsingBlock:^(MKMapItem *item, NSUInteger idx, BOOL *stop) {

            // if we already have an annotation for this MKMapItem,
            // just return because you don't have to add it again

            for (id<MKAnnotation>annotation in mapView.annotations)
            {
                if (annotation.coordinate.latitude == item.placemark.coordinate.latitude &&
                    annotation.coordinate.longitude == item.placemark.coordinate.longitude)
                {
                    return;
                }
            }

            // otherwise, add it to our list of new annotations
            // ideally, I'd suggest a custom annotation or MKPinAnnotation, but I want to keep this example simple

            [annotations addObject:item.placemark];
        }];

        [mapView addAnnotations:annotations];
    }];

    // update our "previous" search, so we can cancel it if necessary

    self.previousSearch = localSearch;
}

weak明らかに、このコード サンプルは、前の検索操作のプロパティがあることを前提としています。(厳密に言えば、これは必要ではありませんが、インターネット接続が遅いときにマップをブラウジングすると、パフォーマンスが向上する可能性があります。) とにかく、そのプロパティは次のように定義されます。

@property (nonatomic, weak) MKLocalSearch *previousSearch;

他にも可能な改良があります (たとえばUIActivityIndicatorView、検索が進行中の場合はネットワーク アクティビティ インジケーター、マップの現在の領域内にない注釈を削除するなど)。

于 2013-04-15T19:07:56.210 に答える