Я использую компонент Google Maps внутри моего проекта Xamarin.iOS. Я хватаю json от моего запроса, анализируя его, пытается добавить каждый массив в ответ как маркер на mapView
. Когда я создаю свое приложение, я не получаю сообщение об ошибке, приложение работает так, как должно. Но на моей карте нет маркеров.
MapController.cs
using System;
using System.Drawing;
using MonoTouch.Foundation;
using MonoTouch.UIKit;
using System.Net;
using System.Json;
using System.IO;
using Google.Maps;
using MonoTouch.CoreLocation;
namespace News
{
public partial class MapController : UIViewController
{
MapView mapView;
public MapController () : base ("MapController", null)
{
Title = "Karta";
}
public override void ViewDidLoad ()
{
base.ViewDidLoad ();
this.NavigationController.NavigationBar.TintColor = UIColor.White;
this.NavigationController.NavigationBar.SetTitleTextAttributes (new UITextAttributes { TextColor = UIColor.White });
this.NavigationController.NavigationBar.BarTintColor = UIColor.Orange;
var camera = CameraPosition.FromCamera (
latitude: 0.0,
longitude: 0.0,
zoom: 6
);
mapView = MapView.FromCamera (RectangleF.Empty, camera);
try {
var request = WebRequest.Create("http://www.example.com");
var response = request.GetResponse ();
using(var stream = new StreamReader(response.GetResponseStream())){
var json = stream.ReadToEnd ();
var jsonVal = JsonValue.Parse (json);
for(var i=0; i<jsonVal["result"].Count; i++){
//CLLocationCoordinate2D coord = new CLLocationCoordinate2D();
InvokeOnMainThread ( () => {
// manipulate UI controls
var marker = new Marker () {
Title = jsonVal["result"][i]["title"],
Snippet = jsonVal["result"][i]["address"],
Position = new CLLocationCoordinate2D (jsonVal["result"][i]["lat"],jsonVal["result"][i]["lon"])
};
marker.Map = mapView;
});
}
};
response.Close ();
}
catch
{
//
}
mapView.StartRendering ();
View = mapView;
}
public override void ViewWillAppear (bool animated)
{
base.ViewWillAppear (animated);
}
public override void ViewWillDisappear (bool animated)
{
mapView.StopRendering ();
base.ViewWillDisappear (animated);
}
}
}
Почему это так?
При запуске вашего примера у вас был блокирующий вызов.
В вашем \Controller\Maps\MapControler.cs
изменение:-
public override void LoadView()
чтобы: -
public async override void LoadView()
а также изменение: -
Task.Run(async() => await StageTheView());
чтобы: -
await StageTheView();
Затем он будет запускаться и отображать маркеры.
Дайте мне знать, если вы хотите, чтобы я отправил обратно решение, если вы все еще испытываете трудности?
Из вашего комментария с api я смог загрузить данные; попробуйте что-то вроде этого.
public override void LoadView ()
{
base.LoadView ();
CameraPosition camera = CameraPosition.FromCamera (62.3909145, 17.3098496, 15);
mapView = MapView.FromCamera (RectangleF.Empty, camera);
mapView.MyLocationEnabled = true;
Task.Run(async () => await StageTheView());
View = mapView;
}
private async Task StageTheView()
{
using (var client = new HttpClient())
{
var result = await client.GetAsync("http://www.unikabutiker.nu/api/?function=searchByName&key=kT6zAOpNk21f9UhhNWzVrK8fHjvl22K2imF1aRkvN9aScUOK6v&name=Sundsvall");
var s = "";
using (var reader = new StreamReader(await result.Content.ReadAsStreamAsync()))
{
s = await reader.ReadToEndAsync();
}
var jsonVal = JsonValue.Parse(s);
for (var i = 0; i < jsonVal["result"].Count; i++)
{
// manipulate UI controls
var marker = new Marker()
{
Title = jsonVal["result"][i]["title"],
Snippet = jsonVal["result"][i]["adress"],
Position = new CLLocationCoordinate2D(jsonVal["result"][i]["lat"], jsonVal["result"][i]["lng"])
};
marker.Map = mapView;
}
}
}
Вам нужно будет добавить ссылку на System.Threading.Tasks и System.Net.Http