2017-03-18 65 views
0

我需要传递一些数据,当应用程序返回到前台时,我已经设法触发该方法,但我无法弄清楚如何触发它在我的ViewController的现有实例中,而不是创建一个新的实例。从AppDelegate访问类的现有实例中的方法

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

      } 
     } 

这里就是我坚持,我曾尝试调查代表并调用这种方法,但我无法理解如何实现它。任何帮助,将不胜感激

+0

可能重复的[如何获得iOS中的所有应用程序的ViewControllers?](http:// stackove rflow.com/questions/14757639/how-to-get-all-the-applications-viewcontrollers-in-ios) – jgoldberger

+0

我在意识到你问到c#之前添加了一个Swift答案。无论如何,看看你的视图控制器订阅UIapplicationWillEnterForeground通知 – Paulw11

回答

1

我将此标记为可能的dupe,但该线程在Obj-C,但是同样的概念可以很容易地使用Xamarin.iOS应用。

刚刚创建的UIViewControllersarrayList一个Singleton类作为该类每次实例化一个新的视图控制器属性,并把它添加到arrayList,也确保你从删除一个视图控制器当视图控制器被布置时,可以使用arrayList

例如你的单身可能看起来像:

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,并在其上执行任何添加或删除操作。

如果您真的只对一个视图控制器感兴趣,那么只需在实例化时将其添加到List,但在不再需要视图控制器时将其删除,因此您不会尝试访问已处理视图控制器,以及视图控制器在不再使用时可以进行垃圾收集。

+0

哦,哇,我从来没有想到这一点,这是一个非常酷的想法,让我走了,我会回到你 – geolaw

+0

它没有崩溃!这是有希望的。我需要一个驱动来测试它,将更新并接受它,如果它的工作,谢谢 – geolaw

1

创建一个单阵列保存所有的生活UIViewController的作品,我个人喜欢让事情去耦,尽我所能,不喜欢保持和维护没有真正的理由的对象列表...

您可以通过来回传递数据:

  • NoticationCenter
    • 选择在任何UIViewController你需要“交谈”,你可以订阅通知和/或注册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; 
          } 
      } 
      
    +0

    这真的比我更好的答案。 :-) – jgoldberger

    +0

    @jgoldberger不是这样的“更好”,但“不同”,我已经看到ViewControllers的单例数组完成了很多次,这是一个有效的风格,它真的取决于你的编程风格。我更喜欢通过'NSNotificationCenter'(或者根据需要编写自定义的C#事件)“事件和订阅”,因为它使用现有的iOS框架(或DotNet框架),因为它被设计为使用...但是,许多方法来剥皮猫;-)它也适用于MVVM或VIPER方法。 – SushiHangover

    +0

    我总是忘记NSNotificationCenter(除非需要获取键盘出现等系统通知)或者只是测试ResponsToSelector。我更喜欢你的“风格”。 :-) – jgoldberger

    相关问题