无法在swift中将图像添加到注释中

时间:2015-01-15 22:21:32

标签: arrays swift parse-platform

我从Parses后端查询了一系列NSData对象(转换后会变成图像),如下所示:

 var query = PFUser.query()
            query.whereKey("location", nearGeoPoint:geopoint)
            query.findObjectsInBackgroundWithBlock({ (objects: [AnyObject]!, error: NSError!) -> Void in

for object in objects {

   var user:PFUser = object as PFUser

     var otherUserImages = [NSData]()

     otherUserImages.append(user["image"] as NSData)

     }
})

我现在有一个NSData对象数组,我想将它们用作图像作为地图上的注释。

所以我创建了一个函数:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

        var view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")

                for userImage in self.otherUserImages {

                view.canShowCallout = true

                var dataImage = UIImage(data: userImage)

                var userMapImage = UIImageView(image: dataImage)

                view.leftCalloutAccessoryView = userMapImage

                }
            }

现在这会将图像作为注释放置,但仅在array[0]我似乎无法将所有图像作为注释?

有人可以告诉我我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我不清楚您是想将每个图像作为注释处理,还是希望将所有图像作为单个注释处理。

在第一种情况下,您似乎错误地使用了mapView:viewForAnnotation:方法。

我认为您已创建MKAnnotation个对象并将其添加到MKMapView,因为mapView:viewForAnnotation:已正确调用。

现在,您应该考虑的是为每个注释调用mapView:viewForAnnotation:。然后,对于每个调用,您应该返回MKPinAnnotationView,并且您应该将单个图像(视图)与每个图像相关联。因此,您需要定义一种机制,以便将MKAnnotation个对象与图像相关联,然后在mapView:viewForAnnotation:中使用该图像。如果您提供有关MKAnnotation的更多详细信息,我可以进一步提供帮助。

另一方面,你可以想到"加入"将您的所有图像合并为一个UIView以与单个注释相关联。在这种情况下,你会做这样的事情:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    var view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")
    var imageView = UIView(frame:...)
    view.leftCalloutAccessoryView = userMapImage

    for userImage in self.otherUserImages {

            view.canShowCallout = true
            var dataImage = UIImage(data: userImage)
            var userMapImage = UIImageView(image: dataImage)
            imageView.addSubview(userMapImage)
    }
}

老实说,我不确定"加入"将所有图像合二为一,但你会更清楚......

在另一枚硬币上,您还应该考虑Reusing Annotation Views

编辑:

您需要建立的是annotationCustom个对象与self.otherUserImages中的对象之间的关系。我不知道你是怎么做到的。也许您需要在annotationCustom课程中添加新属性来保存代表图片的NSData ...或者您可能更愿意将self.otherUserImages转换为NSDictionary和将每个注释name与相应的图像数据相关联。

完成后,您可以使用

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

    var view = MKPinAnnotationView(annotation: annotation, reuseIdentifier: "pin")

    if let myAnnotation = annotation as? annotationCustom {

            view.canShowCallout = true
            var dataImage = myAnnotation.dataForImage
            var userMapImage = UIImageView(image: dataImage)
            view.leftCalloutAccessoryView = userMapImage
    }
    return view;
}

完成上述工作后,您可以考虑使用dequeue来提高性能和内存使用率:

func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView! {

static NSString *viewIdentifier = @"annotationView";
MKPinAnnotationView *annotationView = (MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:viewIdentifier];
if (annotationView == nil) {

    if let myAnnotation = annotation as? annotationCustom {

            view.canShowCallout = true
            var dataImage = myAnnotation.dataForImage
            var userMapImage = UIImageView(image: dataImage)
            view.leftCalloutAccessoryView = userMapImage
    }
    return view;
}

我希望myAnnotation.dataForImage位足够清楚......