从AppDelegate

时间:2017-03-18 00:55:54

标签: c# ios xamarin xamarin.ios

我需要传递一些我在应用程序回到前台时抓取的数据,我已设法触发该方法,但我无法弄清楚如何在我的ViewController的现有实例中触发它而不是制作一个新实例。

Map.cs

 public delegate void beginRefreshMapLine(ReturnRouteTaken returnRouteTaken);

  public void updateRouteList(ReturnRouteTaken returnRouteData)
    {
        coordList = new List<CLLocationCoordinate2D>();
        foreach(GPSData point in returnRouteData.GPSData)
        {
            coordList.Add(new CLLocationCoordinate2D { Latitude = double.Parse(point.Lat), Longitude = double.Parse(point.Lng) });

            updateMap(this, new EventArgs());
        }
    }

这是我需要从AppDelegate.cs

在当前实例中触发的方法

AppDelegate.cs

if (GlobalVar.BoolForKey("trackMe"))
        {
            ReturnRouteTaken returnRouteData = webtools.GetRouteTaken(new ReturnRouteTaken() { TestDriveID = GlobalVar.IntForKey("routeTrackedID") });
            if (returnRouteData.GPSData.Count > 0)
            {

            }
        }

这是我被困的地方,我已经尝试过调查代理并以这种方式调用方法,但我无法理解如何实现它。任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

我将此标记为可能的dupe,但该线程位于Obj-C中,但使用Xamarin.iOS可以轻松应用相同的概念。

只需创建一个Single房类,arrayList UIViewControllers作为该类中的属性,每次实例化一个新的ViewController时,将其添加到{{1} }或array,还要确保在放置视图控制器时从Listarray删除视图控制器。

e.g。你的单身人员可能看起来像:

List

然后,您始终可以使用public class ViewControllerHolder { // make constructor private to force use of Instance property // to create and get the instance. private ViewControllerHolder() { } private static ViewControllerHolder _instance; public static ViewControllerHolder Instance { get { if (_instance == null) { _instance = new ViewControllerHolder(); _instance.Controllers = new List<UIViewController>(); } return _instance; } } public List<UIViewController> Controllers { get; private set; } } 访问List个视图控制器,并对其执行任何添加或删除操作。

如果您真的只对一个视图控制器感兴趣,那么只需在实例化时将其添加到ViewControllerHolder.Instance.Controllers,但在不再需要视图控制器时将其删除,这样您就不会尝试访问已配置的视图控制器,以便在视图控制器不再使用时可以对其进行垃圾回收。

答案 1 :(得分:1)

创建一个包含所有生命UIViewController的单例数组,我个人喜欢尽可能地将事物解耦,并且不喜欢持有和维护对象列表而没有真正的理由......

您可以通过以下方式传递数据:

  • 选择
  • NoticationCenter

在您需要的任何UIViewController中&#34;谈话&#34;您可以订阅通知和/或注册Selector s。

在您希望收到通知的UIViewController注册表中

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    NSNotificationCenter.DefaultCenter.AddObserver(this, new Selector(Const.StartRefresh), new NSString(Const.StartRefresh), null);
}

仍然在UIViewController中,实施通知中心将执行send_msg的选择器:

[Export(Const.StartRefresh)]
void LocalStartRefresh(NSNotification notification)
{
    if (notification.Name == Const.StartRefresh)
        Console.WriteLine("StartRefresh from NotificationCenter:" + notification.Object);
}

UIApplicationDelegate中,使用通知中心向已订阅的每个有效NSNotification发布新的UIViewController

public override void WillEnterForeground(UIApplication application)
{
    NSNotificationCenter.DefaultCenter.PostNotificationName(Const.StartRefresh, new NSString("some custom data"));
}

,跳过通知并直接调用Selector

UIViewController中,实现选择器/方法来调用:

[Export(Const.StopRefresh)]
void LocalStopRefresh()
{
    Console.WriteLine("StopRefresh from Selector");
}

UIApplicationDelegate中,向接受此Selector所有实例化视图控制器实例发送操作:

public override void DidEnterBackground(UIApplication application)
{
    var vc = UIApplication.SharedApplication?.KeyWindow?.RootViewController;
    while (vc != null)
    {
        if (vc.RespondsToSelector(new Selector(Const.StopRefresh)))
            UIApplication.SharedApplication.SendAction(new Selector(Const.StopRefresh), vc, this, new UIEvent());
        vc = vc.PresentedViewController;
    }
}