Domanda
Come posso conservare / accesso variabili globali all'interno di un'applicazione MonoTouch? Sto recuperare la posizione GPS (utilizzando Monotouch.CoreLocation.CLLocationManager) durante il metodo FinishedLaunching del AppDelegate. Come posso quindi accedere a tali informazioni da una proprietà su quel AppDelegate (da una vista, per esempio)? O c'è un altro metodo preferito per i dati globale?
UPDATE: Voglio solo per afferrare la posizione una volta, in fase di avvio, quindi avere accesso a quella posizione da tutti i miei punti di vista. Ecco la mia AppDelegate - mi piacerebbe accedere al campo locationManager da una vista. Posso certamente aggiungere una proprietà di farlo, ma credo che la mia domanda è "Come accedo che la proprietà da una vista (o posso anche, considerando che è un delegato)"?
// The name AppDelegate is referenced in the MainWindow.xib file.
public partial class AppDelegate : UIApplicationDelegate
{
private CLLocationManager locationManager = new CLLocationManager();
// This method is invoked when the application has loaded its UI and its ready to run
public override bool FinishedLaunching (UIApplication app, NSDictionary options)
{
locationManager.Delegate = new GpsLocationManagerDelegate();
locationManager.StartUpdatingLocation();
window.AddSubview (navController.View);
window.MakeKeyAndVisible ();
return true;
}
// This method is required in iPhoneOS 3.0
public override void OnActivated (UIApplication application)
{
}
}
Soluzione
In generale, la maggior parte delle persone vi dirà di evitare le variabili globali e invece passare ciò che è necessario nella delegato. (Sono d'accordo con quel sentimento).
Tuttavia, è possibile utilizzare una classe Singleton, un localizzatore di servizio, o di una classe statica con campi statici / oggetti da ottenere un comportamento globale variabile come in C # (o qualsiasi altro linguaggio compatibile Dotnet / Mono).
Nel tuo caso, presumo che hai scritto la classe GpsLocationManagerDelegate da soli. Se è così, è possibile modificare il costruttore di prendere i parametri per le informazioni necessarie (la vista, un riferimento al delegato app, e / o un riferimento al location manager) e memorizzarlo nella propria istanza GpsLocationManagerDelegate. Se non hai scritto GpsLocationManagerDelegate te stesso e non è dichiarato sigillato, sottoclasse e creare un costruttore appropriato.
In questo esempio sembra vicino a quello che stai dopo: http: // www.conceptdevelopment.net/iPhone/MapKit01/Main.cs.htm
Altri suggerimenti
Si dovrebbe fare locationManager una proprietà pubblica, allora si può accedere dalla maggior parte dei luoghi in app in questo modo:
CLLocationManager LocationManager {get;set;}
AppDelegate delegateReference =
(AppDelegate)UIApplication.SharedApplication.Delegate;
quindi accedere alla locationmanager ovunque nel codice tramite:
delegateReference.LocationManager
In generale, è necessario impostare cose come single, l'installazione all'interno del AppDelegate.