Ios UIDABBARCONTROLLER等待加载UIViewController,直到选择Xamarin
在Ios UIDABBARCONTROLLER等待加载UIViewController,直到选择Xamarin,ios,xamarin.ios,xamarin,Ios,Xamarin.ios,Xamarin,在UIAbbarController中选择新的UIViewController时,是否可以调用方法?或者,是否可以等待加载整个UIViewController,直到选择视图 我有一个UITabBarController,看起来像: public sealed class VisualizationViewController : UITabBarController { private UIViewController tabVand, tabVarme, tabEl;
UIAbbarController
中选择新的UIViewController
时,是否可以调用方法?或者,是否可以等待加载整个UIViewController
,直到选择视图
我有一个UITabBarController
,看起来像:
public sealed class VisualizationViewController : UITabBarController
{
private UIViewController tabVand, tabVarme, tabEl;
private UIToolbar toolbar;
public VisualizationViewController()
{
toolbar = new UIToolbar(new RectangleF(0, 0, (float)View.Frame.Width, 60));
toolbar.AutoresizingMask = UIViewAutoresizing.FlexibleWidth;
View.AddSubview(toolbar);
tabVand = new WaterVisualizationViewController();
tabVand.Title = "Vand";
tabVand.TabBarItem = new UITabBarItem("Vand", UIImage.FromFile("Images/Water.png"), 0); // Tag == initial order
tabVand.TabBarItem.SetFinishedImages( UIImage.FromFile("Images/Water.png"), UIImage.FromFile("Images/Water.png"));
tabVand.View.BackgroundColor = UIColor.LightGray;
tabVarme = new TemperatureViewController();
tabVarme.Title = "Varme";
tabVarme.TabBarItem = new UITabBarItem("Varme", UIImage.FromFile("Images/Heat.png"), 1); // Tag == initial order
tabVarme.TabBarItem.SetFinishedImages(UIImage.FromFile("Images/Heat.png"), UIImage.FromFile("Images/Heat.png"));
tabVarme.View.BackgroundColor = UIColor.LightGray;
tabEl = new ElVisualizationViewController();
tabEl.Title = "EL";
tabEl.TabBarItem = new UITabBarItem("EL", UIImage.FromFile("Images/Power.png"), 2); // Tag == initial order
tabEl.TabBarItem.SetFinishedImages(UIImage.FromFile("Images/Power.png"), UIImage.FromFile("Images/Power.png"));
tabEl.View.BackgroundColor = UIColor.LightGray;
var tabs = new[]
{
tabVand, tabVarme, tabEl
};
ViewControllers = tabs;
SelectedViewController = tabVand;
}
现在,它加载所有视图,这将是一个昂贵的调用,当我从虚拟数据移动到每个视图应该加载的真实数据时。因此,我只想在
uitabarcontroller
中选择视图时进行数据调用,因此发生的情况是,您的ViewDidLoad()方法正在为构造函数中的每个选项卡视图控制器触发(假设您在那里调用Web服务)。加载的每个视图都会触发,因为您正在调用View.Background,它将视图加载到内存中。您不希望在此处执行此操作,但在每个选项卡视图控制器的ViewDidLoad()方法中:
public sealed class VisualizationViewController : UITabBarController
{
private UIViewController tabVand, tabVarme, tabEl;
private UIToolbar toolbar;
public VisualizationViewController()
{
base.ViewDidLoad();
toolbar = new UIToolbar(new RectangleF(0, 0, (float)View.Frame.Width, 60));
toolbar.AutoresizingMask = UIViewAutoresizing.FlexibleWidth;
View.AddSubview(toolbar);
tabVand = new WaterVisualizationViewController();
tabVand.Title = "Vand";
tabVand.TabBarItem = new UITabBarItem("Vand", UIImage.FromFile("Images/Water.png"), 0); // Tag == initial order
tabVand.TabBarItem.SetFinishedImages( UIImage.FromFile("Images/Water.png"), UIImage.FromFile("Images/Water.png"));
//Don't do this, it will make its ViewDidLoad fire
//and you don't want that.
//tabVand.View.BackgroundColor = UIColor.LightGray;
tabVarme = new TemperatureViewController();
tabVarme.Title = "Varme";
tabVarme.TabBarItem = new UITabBarItem("Varme", UIImage.FromFile("Images/Heat.png"), 1); // Tag == initial order
tabVarme.TabBarItem.SetFinishedImages(UIImage.FromFile("Images/Heat.png"), UIImage.FromFile("Images/Heat.png"));
//tabVarme.View.BackgroundColor = UIColor.LightGray;
tabEl = new ElVisualizationViewController();
tabEl.Title = "EL";
tabEl.TabBarItem = new UITabBarItem("EL", UIImage.FromFile("Images/Power.png"), 2); // Tag == initial order
tabEl.TabBarItem.SetFinishedImages(UIImage.FromFile("Images/Power.png"), UIImage.FromFile("Images/Power.png"));
//tabEl.View.BackgroundColor = UIColor.LightGray;
var tabs = new[]
{
tabVand, tabVarme, tabEl
};
ViewControllers = tabs;
SelectedViewController = tabVand;
}
然后在每个单独的选项卡(UIViewController)实现中,在它的viewdiload()
方法中调用web服务,而不是在构造函数中调用。例如:
public class WaterVisualizationViewController : UIViewController
{
public WaterVisualizationViewController()
{
//Don't call your web service here
}
public override ViewDidLoad()
{
//Set your background color here
//Call your web service
//Populate your UI with data
}
}
现在,如果您的web服务调用很昂贵,您可能会在点击选项卡时看到一些延迟。为此,您应该考虑使用显示“加载数据”类型的指示器,以便用户有反馈,您的应用程序正在做某事而不被冻结。或者,您可以使用Xamarin组件存储,该存储非常易于使用如何以及在何处从视图控制器(选项卡)填充数据?每个选项卡都是不同的UIViewController。它们中的每一个都将从web服务中获得一些数据,它将使用这些数据来填充图形。这就是为什么最好只加载我们正在查看的视图,而不是全部3个视图(在本例中)。还请注意,您可能需要加入一些逻辑并可能缓存数据,这样您就不会在用户每次点击选项卡时不必要地一直调用web服务。你可能想要,也可能不想要,所以这是值得考虑的事情。谢谢!没有注意到设置背景颜色会加载视图。我只是按照我发现的一个例子,他们在哪里做的。谢谢,SharpMobileCode