Xamarin сопоставляет пользовательские контакты iOS

#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 массив, когда вы используете эту функцию.