0

在我的地图应用程序中,用户可以在搜索栏中输入地址,该位置会以红色图钉显示。是否可以在我的代码中让用户在将图钉放置在地图上之前输入自定义标题和副标题?标题和副标题应显示在标注气泡中。这是怎么做到的?现在,我所有的别针标题都是“我的地方”。

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar

{

    if (!self.geocoder)
    {
        self.geocoder = [[CLGeocoder alloc] init];
    }

    NSString *address = [NSString stringWithFormat:@"%@", self.searchBar.text];

    [self.geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {
        if ([placemarks count] > 0)
        {
            CLPlacemark *placemark = [placemarks objectAtIndex:0];
            CLLocation *location = placemark.location;
            CLLocationCoordinate2D coordinate = location.coordinate;

            NSLog (@"%f %f", coordinate.latitude, coordinate.longitude);

            MKCoordinateRegion region;
            MKCoordinateSpan span;
            span.latitudeDelta = 0.01;
            span.longitudeDelta = 0.01;
            region.span = span;
            region.center = coordinate;

            MKPointAnnotation *annotation = [[MKPointAnnotation alloc] init];
            [annotation setCoordinate:coordinate];
            [annotation setTitle:@"My Place"];
            [[self mapView] addAnnotation:annotation];

            [self.mapView setRegion:region animated:TRUE];
            [self.mapView regionThatFits:region];

            [self.searchBar resignFirstResponder];
            self.searchBar.text = @"";

        }
    }];

}

另外,如何将我所有的 pin 保存到 NSUserDefault,以便在应用程序重新启动时显示它们?这会起作用吗,还是只会节省一个引脚?

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
                [defaults setDouble:coordinate.latitude forKey:allPins_latitude];
                [defaults setDouble:coordinate.longitude forKey:allPins_longitude];
                [defaults setBool:YES forKey:allPins_coordinates];
                [defaults synchronize];

我将不胜感激任何帮助!谢谢!

4

3 回答 3

1

当然,您可以让您的用户输入标题。

您上面的代码创建了一个注释对象并将其标题设置为固定标题。

不要这样做,而是创建注释,将其保存到实例变量,并使用 UIAlertViewStylePlainTextInput 显示警报视图以收集注释的名称。让自己成为alert view的delegate,然后在你的alertView:clickedButtonAtIndex:方法中,如果用户点击ok,从alert view中获取title,在annotation上设置title属性,将annotation添加到map

至于将注释保存到用户默认值:

我建议创建您自己的符合 MKAnnotation 对象的对象。它只需要一个坐标属性、一个标题属性和一个副标题属性。使您的注释对象符合 NSCoding 协议(实现 initWithCoder 和 encodeWithCoder。)

完成此操作后,您可以使用 NSKeyedArchiver 类方法 archivedDataWithRootObject 将整个注释对象数组转换为 NSData。然后只需将数据保存到用户默认值。启动时,读取 NSData 对象,使用 unarchiveObjectWithData: 将其转换回自定义注释对象数组,然后将注释添加回地图。

于 2013-09-08T23:59:35.557 回答
0

如果您想为每个点设置不同的标题和副标题,您需要提供一个文本框供用户输入数据。一旦完成,它就像您已经拥有的代码一样简单

NSString *title = [self.titleField stringValue];
[annotation setTitle:@"title"];
NSString *subtitle = [self.subtitleField stringValue];
[annotation setSubtitle:@"title"];

但是,您可能没有屏幕空间来显示三个文本字段。我所做的是使用默认名称创建图钉,然后允许用户打开标注气泡,或者自动打开它并显示一个按钮来编辑它,然后在顶部显示一个模式对话框来编辑标题和副标题

如果您coordinate.latitude在密钥下保存了每个,allPins_latitude那么每个都将覆盖前一个,并且您只会保存最后一个。如果您的引脚都存储为数组,请存储数组。

于 2013-09-08T23:56:15.257 回答
0

@petter 我认为下面的代码会帮助你 //swift 3

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

       let Userlocation : CLLocation = locations[0]

       let center = CLLocationCoordinate2D(latitude: Userlocation.coordinate.latitude
           , longitude: Userlocation.coordinate.longitude)


        let annotation = MKPointAnnotation() 
        annotation.coordinate = center 
        annotation.title = "title" 
        Annotation.subtitle = “Subtitle”
        mapView.addAnnotation(annotation)
        let region = MKCoordinateRegion(center: center, span:  MKCoordinateSpan(latitudeDelta: 0.01, longitudeDelta: 0.01))

      mapView.setRegion(region, animated: true)

   }
于 2017-03-30T07:03:34.990 回答