在我的应用程序中,我有两个地址UITextfields可以使用地址文本填充。我想要这种行为:

  • 一旦用户输入地址文本字段,就会从下方显示一个地图。 (已完成)
  • 用户在玩地图。当他这样做时,将出现一个即将删除的浮动注释对象。
  • 当按下按钮(mkmapview的子视图)时,会将此浮动注释放到地图上。
  • 一旦用户按下“完成”按钮,地图上的注释位置就会被反向地理编码。
  • 地图视图消失(已完成)。
  • 用与地图视图中心相对应的地址文本填充UITextfield。
  • 对于另一个UITextfield重复相同的操作。

  • 我相信这是mkmapview的非常直接的用例。但是找不到已经完成的任何示例。
    我在UIKit中缺少明显的东西吗?

    非常感谢您的帮助....

    编辑:

    我读了Apple's docs,发现很多solutions都指向此。
    但是,它们似乎都假定MKPinAnnotationView(或MKAnnotationView)已被覆盖。

    有必要吗?
    如果是,除了拖动外,我还需要在子类中提供多少?

    最佳答案

    无需子类MKPinAnnotationView。只需使用它。如果您要查找某些自定义行为,则仅应将其子类化。但是编写viewForAnnotation很有用,以便您可以正确配置它。但是通常我发现标准MKPinAnnotationView的配置非常简单,不需要子类化:

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        if ([annotation isKindOfClass:[MKUserLocation class]])
            return nil;
    
        MKPinAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"DroppedPin"];
    
        annotationView.draggable = YES;
        annotationView.canShowCallout = YES;
        annotationView.animatesDrop = YES;
    
        return annotationView;
    }
    

    话虽如此,拥有自己的注释类并不少见。我这样做至少有两个原因:
  • 您可以将反向地理编码的MKPlacemark保留为注释的属性。从逻辑上讲,经过地理编码的信息似乎是注释的属性,而不是视图的属性。然后,您可以查询放置的图钉的placemark属性,以获取需要传递回其他视图的所有信息。
  • 如果需要,可以将注释配置为既执行反向地理编码查询(具有placemark属性),又可以在更改其coordinate时将标题更改为反向地理编码的地址。这样,用户在将销钉拖放到地图上时会获得有关反向地理编码的主动反馈,但是代码仍然非常简单:

  • 因此,您可能有一个注释类,例如:
    @interface DroppedAnnotation : NSObject <MKAnnotation>
    
    @property (nonatomic, strong) MKPlacemark *placemark;
    @property (nonatomic) CLLocationCoordinate2D coordinate;
    @property (nonatomic, strong) NSString *title;
    @property (nonatomic, strong) NSString *subtitle;
    
    @end
    
    @implementation DroppedAnnotation
    
    - (void)setCoordinate:(CLLocationCoordinate2D)coordinate
    {
        CLLocation *location = [[CLLocation alloc] initWithLatitude:coordinate.latitude
                                                          longitude:coordinate.longitude];
        CLGeocoder *geocoder = [[CLGeocoder alloc] init];
        [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
            // do whatever you want here ... I'm just grabbing the first placemark
    
            if ([placemarks count] > 0 && error == nil)
            {
                self.placemark = placemarks[0];
    
                NSArray *formattedAddressLines = self.placemark.addressDictionary[@"FormattedAddressLines"];
                self.title = [formattedAddressLines componentsJoinedByString:@", "];
            }
        }];
    
        _coordinate = coordinate;
    }
    
    @end
    

    您的视图控制器可以使用以下新类:
    @property (nonatomic, weak) id<MKAnnotation> droppedAnnotation;
    
    - (void)dropPin
    {
        // if we've already dropped a pin, remove it
    
        if (self.droppedAnnotation)
            [self.mapView removeAnnotation:self.droppedAnnotation];
    
        // create new dropped pin
    
        DroppedAnnotation *annotation = [[DroppedAnnotation alloc] init];
        annotation.coordinate = self.mapView.centerCoordinate;
        annotation.title = @"Dropped pin"; // initialize the title
        [self.mapView addAnnotation:annotation];
    
        self.droppedAnnotation = annotation;
    }
    

    需要明确的是,您不需要自己的注释类。例如,您可以使用标准的MKPointAnnotation。但是,然后,您的视图控制器必须保持调用并跟踪反向地理编码信息本身。我只是认为当您使用自定义注释类时,代码会更简洁,更合理。

    10-05 21:57