Monotouch - 全局变量

时间:2010-01-13 19:19:07

标签: xamarin.ios

如何在monotouch应用程序中存储/访问全局变量?我正在AppDelegate的FinishedLaunching方法中检索GPS位置(使用Monotouch.CoreLocation.CLLocationManager)。然后,我如何从该appdelegate上的属性访问该信息(例如,从视图中)?或者还有另一种全球数据的首选方法吗?

更新: 我只想在启动时抓住一次该位置,然后从我的所有视图访问该位置。这是我的AppDelegate - 我想从视图中访问locationManager字段。我当然可以添加一个属性,但我想我的问题是“我如何从一个视图中访问该属性(或者我可以考虑它是一个委托)”?

// 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)
    {
    }
}

2 个答案:

答案 0 :(得分:3)

通常,大多数人会告诉您避免全局变量,而是将您需要的内容传递给委托。 (我同意这种观点)。

但是,您可以使用单例类,服务定位器或具有静态字段/属性的静态类来获取C#(或任何其他Dotnet / Mono兼容语言)中的全局变量行为。

在您的情况下,我假设您自己编写了GpsLocationManagerDelegate类。如果是这样,您可以更改构造函数以获取必要信息的参数(视图,对应用程序委托的引用和/或对位置管理器的引用)并将其存储在GpsLocationManagerDelegate实例中。如果您没有自己编写GpsLocationManagerDelegate并且它未声明为密封,则将其子类化并创建适当的构造函数。

这个例子似乎与你所追求的完全相同:http://www.conceptdevelopment.net/iPhone/MapKit01/Main.cs.htm

答案 1 :(得分:1)

您应该将locationManager设为公共属性,然后您可以从应用中的大多数位置访问它,如下所示:

CLLocationManager LocationManager {get;set;}

AppDelegate delegateReference = 
     (AppDelegate)UIApplication.SharedApplication.Delegate;

然后通过以下方式访问位置管理器:

delegateReference.LocationManager

通常,您应该在AppDelegate中设置单例,设置等内容。