[MonoTouch] DidSelectAnnotationView and Loading View
Tomasz Cielecki
tomasz at ostebaronen.dk
Mon Dec 12 09:50:01 EST 2011
Hey there,
I am having some troubles with a Loading View being called late when
trying to call it from DidSelectAnnotationView in my Delegate for my
MapView.
So let me explain what I am trying to do:
I have a TabBarController, which has some tabs in it, one of them
being a Controller with a MapView in it, another with a Scroll View
displaying some elaborate data about the annotations. This all works
fine, but because of loading the data on that Scroll View takes a long
time first time loading it I want to display a Loading View, and when
everything is initialized in the Scroll View I will dismiss that
Loading View. This Loading View should show up when pressing an
Annotation on the map or when pressing the TabBar Item for the
Controller which takes a long time to load. Currently I am trying with
the Annotations first.
So my Loading View is resided in the AppDelegate so I can call it from
everywhere and dismiss it from everywhere (this works fine, I am using
it in other parts of my code as well).
Now when I call the method displaying the Loading View it gets shown
after the tab with the Scroll View is selected. Here is what I am
doing in my Delegate:
public override void DidSelectAnnotationView (MKMapView mapView,
MKAnnotationView view)
{
if (view.Annotation is MapAnnotation)
{
//Show Loading View
((AppDelegate)UIApplication.SharedApplication.Delegate).ShowProgressBar();
var mapAnnotation = view.Annotation as MapAnnotation;
var inventory = ViewModelFactory.Inventory;
inventory.SelectedLocation = mapAnnotation.Location;
//Go to the LocationsScrollViewController
foreach (var vc in mapViewController.TabBarController.ViewControllers)
{
if (vc is UINavigationController)
{
var topCont = (vc as UINavigationController).TopViewController;
if (topCont is LocationsScrollViewController)
((LocationsScrollViewController)topCont).InvokeScrollToSelectedLocation
= true;
}
}
//Deselect the annotation, otherwise this method will not be
triggered when pushing the annotation again!
foreach (MKAnnotation an in mapView.SelectedAnnotations)
mapView.DeselectAnnotation(an, false);
mapViewController.TabBarController.SelectedIndex = 1;
}
}
My Loading View is just a view with a progress indicator and a label
which I bring to front.
So what happens here is that it switches to the Tab I want to show and
THEN showing the Loading View. I have tried invoking it on the main
thread as well. Though I suspect that it is already there and the main
thread is being blocked by selecting the index on the TabBarController
as it might have a higher priority, therefore it completes after the
tab has been selected and hence the ProgressBar is shown too late.
Do you have any ideas how I can make sure the Loading View is
displaying before the tab is switched?
--
Med Venlig Hilsen / With Best Regards
Tomasz Cielecki
http://ostebaronen.dk
More information about the MonoTouch
mailing list