#c# #ios #xamarin #maps #renderer
#c# #iOS #xamarin #Карты #средство визуализации
Вопрос:
у меня есть приложение, в котором я загружаю определенные данные с сервера через Json. В моем случае имеется около 12 записей. На основе записи на карте должны быть разные изображения контактов. Это мой код:
async private void GetWoodWork()
{
.......
.......
if(result != null)
{
List<ObjectData> objectDatas = JsonConvert.DeserializeObject<List<ObjectData>>(result);
foreach (ObjectData data in objectDatas)
{
string imageName;
string type;
switch(data.objectTyp)
{
case "0":
imageName = "fallenTree.png";
type = "Umgefallener Baum";
break;
case "1":
imageName = "illRubbish.png";
type = "Illegale Müllentsorgung";
break;
case "2":
imageName = "rubbishFull.png";
type = "Mülleimer voll";
break;
case "3":
imageName = "handsaw.png";
type = "Waldarbeiten";
break;
default:
imageName = "questionMark.png";
type = "Sonstiges";
break;
}
Position position = new Position(double.Parse(data.latitude, CultureInfo.InvariantCulture), double.Parse(data.longitude, CultureInfo.InvariantCulture));
var pin = gps.AddPinToMap(type, position, imageName, LocationMap, data.objectTyp);
//customPins.Add(pin);
LocationMap.CustomPins = new List<CustomPin> { pin };
LocationMap.Pins.Add(pin);
}
LocationMap.CustomPins = customPins;
}
}
Эти функции работали нормально. И каждый вывод получает данные, которые он должен. В качестве MapRender в iOS у меня есть следующий код
protected override MKAnnotationView GetViewForAnnotation(MKMapView mapView, IMKAnnotation annotation)
{
MKAnnotationView annotationView = null;
if (annotation is MKUserLocation)
return null;
customPins = formsMap.CustomPins;
CustomPin customPin = customPins[0];
if(customPins != null)
{
annotationView = mapView.DequeueReusableAnnotation(customPin.Name);
if (annotationView == null)
{
annotationView = new CustomMKAnnotationView(annotation, customPin.Name);
annotationView.Image = UIImage.FromFile(customPin.ImageName);
annotationView.CalloutOffset = new CGPoint(0, 0);
annotationView.LeftCalloutAccessoryView = new UIImageView(UIImage.FromFile(customPin.ImageName));
annotationView.RightCalloutAccessoryView = UIButton.FromType(UIButtonType.DetailDisclosure);
((CustomMKAnnotationView)annotationView).Name = customPin.Name;
((CustomMKAnnotationView)annotationView).Url = customPin.Url;
}
annotationView.CanShowCallout = true;
}
Если бы я установил точку останова в GetViewForAnnotation
at annotationView.Image = UIImage.FromFile(customPin.ImageName)
, я мог бы видеть, что я получаю там правильную информацию. Но если карта загружена, все контакты имеют одинаковое изображение. Но у них должны быть разные изображения.
Я понятия не имею и нуждаюсь в помощи. Заранее спасибо!
Комментарии:
1. Кажется, вы всегда используете первый элемент из своего
customPins
массива. Необходимые вам данные (изображение и т. Д.) Должны быть связаны с вашимMKAnnotation
подклассом. ВGetViewForAnnotation
вы добавляете прилагаемую аннотацию к своему типу подкласса и получаете доступ к свойствам.2. @Paulw11 это верно. Перед вызовом функции
GetWoodWork
я добавляю актуальную позицию на свою карту. Это работает нормально, и pin-код отображается с правильным изображением. После этого я звонюGetWoodWork
. В этом методе я также попытался заполнить список всеми контактами, после чего я установил этот список на свою карту. Затем я запускаю поиск по списку.GetViewForAnnotation
Там я вижу, что для аннотации установлены правильные изображения, но если карта загружена, все контакты имеют одинаковое изображение.3. Но вы говорите так:
CustomPin customPin = customPins[0];
— вы всегда используете первый вывод. Вам нужно использовать аннотацию, которая была передана функции. Вам вообще не нужно ссылаться на свойCustomPins
массив, когда вы используете эту функцию.