【问题标题】:MapView with multiple annotations with callouts, how to pass title to next view带有标注的多个注释的 MapView,如何将标题传递给下一个视图
【发布时间】:2012-10-24 22:15:45
【问题描述】:

我有一个 mapView,用户可以在其中按下以放置图钉。一次可能有多个引脚,每个注释视图都有一个标注,在按下时将新视图推送到堆栈。我想要做的是将注释视图的标题传递给第二个视图中的标签。

这是我放置图钉的代码:

-(void)press:(UILongPressGestureRecognizer *)recognizer
{
    CGPoint touchPoint = [recognizer locationInView:worldView];
    CLLocationCoordinate2D touchMapCoordinate = [worldView convertPoint:touchPoint toCoordinateFromView:worldView];

    geocoder = [[CLGeocoder alloc]init];
    CLLocation *location = [[CLLocation alloc]initWithCoordinate:touchMapCoordinate
                                                    altitude:CLLocationDistanceMax
                                          horizontalAccuracy:kCLLocationAccuracyBest
                                            verticalAccuracy:kCLLocationAccuracyBest
                                                   timestamp:[NSDate date]];
    [geocoder reverseGeocodeLocation:location
               completionHandler:^(NSArray *placemarks, NSError *error) {
                   NSLog(@"reverseGeocoder:completionHandler: called");
                   if (error) {
                       NSLog(@"Geocoder failed with error: %@", error);
                   } else {
                       CLPlacemark *place = [placemarks objectAtIndex:0];
                       address = [NSString stringWithFormat:@"%@ %@, %@ %@", [place subThoroughfare], [place thoroughfare], [place locality], [place administrativeArea]];

                       if (UIGestureRecognizerStateBegan == [recognizer state]) {
                           addressPin = [[MapPoint alloc]initWithCoordinate:touchMapCoordinate
                                                                        title:address];
                           [worldView addAnnotation:addressPin];
                       }
                   }
               }];
}

这是我调用第二个视图的代码:

-(void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
   PinViewController *pinViewController = [[PinViewController alloc]init];
    [self passValues];
    [[self navigationController]pushViewController:pinViewController animated:YES];
}

【问题讨论】:

    标签: objective-c annotations callouts


    【解决方案1】:

    您可以覆盖 MKAnnotation(例如 MyLocation)并在 MyLocation.h 文件中声明

    #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>
    
    @interface MyLocation : NSObject <MKAnnotation> {
        NSNumber *identyfier;
        NSString *_name;
        NSString *_address;
        CLLocationCoordinate2D _coordinate;
    }
    
    @property (copy) NSString *name;
    @property (copy) NSString *address;
    @property (copy) NSNumber *identyfier;
    @property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
    
    - (id)initWithName:(NSString*)name address:(NSString*)address 
        coordinate:(CLLocationCoordinate2D)coordinate identyfier:(NSNumber *) identyfier;
    

    @结束

    在 MyLocation.m 文件中:

    #import "MyLocation.h"
    
    @implementation MyLocation
    
    @synthesize name = _name;
    @synthesize address = _address;
    @synthesize coordinate = _coordinate;
    @synthesize identyfier = _identyfier;
    
    - (id)initWithName:(NSString*)name address:(NSString*)address 
        coordinate:(CLLocationCoordinate2D)coordinate identyfier:(NSNumber *)identyfier {
        if ((self = [super init])) {
            _name = [name copy];
            _address = [address copy];
            _coordinate = coordinate;
            _identyfier = identyfier;
        }
        return self;
    }
    

    在您的地图视图中,当您声明注释时,请使用以下方法:

    MyLocation *pin = [[MyLocation alloc] initWithName:place.name address:place.address coordinate:coordinate2D identyfier:some_id];
    

    例如在您的地图委托中:

    - (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
    

    你可以使用:

    ((MyLocation *)annotation).identyfier
    

    检查选中的注解(当然你可以在 MyLocation 类中使用不同的变量)

    【讨论】:

    • 没有有限数量的 pin 会被关闭,那么如何给 pin 一个随机的 NSNumber 标识符?
    • 在我的示例中,我使用 sqlite 在地图上创建和下一个显示注释。我有带有“自动增量”的 id,所以没有办法让某些引脚具有相同的 id。如果将注释存储在数组中,则可以使用数组索引。
    • 那么我无法理解的是如何将地理编码地址存储在 MyLocation 类的地址变量中?很抱歉问了这么多问题,但我对此很陌生。
    【解决方案2】:

    通常当我需要传递变量时,我只需创建一个全局变量,然后两个视图都可以读取。

    extern (NSString *)some_variable_name,你把它放在 .h 文件和你全局放在的 .m 文件中 (NSString *)some_variable_name ;

    所有视图都可以读取的

    或者变量前面的 + 号,然后可以被包含该视图的所有视图读取(在 .m 文件的顶部设置全局,在 .h 文件中通过命令设置

    something = [someview that_variable] ;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-29
      • 2020-05-15
      • 1970-01-01
      相关资源
      最近更新 更多