我需要传递一些我在应用程序回到前台时抓取的数据,我已设法触发该方法,但我无法弄清楚如何在我的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)
{
}
}
这是我被困的地方,我已经尝试过调查代理并以这种方式调用方法,但我无法理解如何实现它。任何帮助将不胜感激
答案 0 :(得分:1)
我将此标记为可能的dupe,但该线程位于Obj-C中,但使用Xamarin.iOS可以轻松应用相同的概念。
只需创建一个Single房类,array
或List
UIViewControllers
作为该类中的属性,每次实例化一个新的ViewController时,将其添加到{{1} }或array
,还要确保在放置视图控制器时从List
或array
删除视图控制器。
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
的单例数组,我个人喜欢尽可能地将事物解耦,并且不喜欢持有和维护对象列表而没有真正的理由......
您可以通过以下方式传递数据:
在您需要的任何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;
}
}