2017-03-18 82 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