UITabBarController等待加载UIViewController,直到选中Xamarin

时间:2015-02-26 09:25:10

标签: ios xamarin.ios xamarin

UIViewController中选择新的UITabBarController时,是否可以调用方法?或者是否可以等待加载整个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;
    }

现在,当我从虚拟数据移动到每个视图应加载的实际数据时,它会加载所有视图,这将是一个昂贵的调用。所以我只想在UITabBarController

中选择视图时进行数据调用

1 个答案:

答案 0 :(得分:2)

所发生的事情是你的ViewDidLoad()方法正在为你的构造函数中的每个制表符视图控制器触发(假设你在那里调用你的web服务)。每个View Did Load都会触发,因为您正在调用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)实现中,使用它的ViewDidLoad()方法调用您的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
  }
}

现在,如果您的网络服务电话费用昂贵,点按标签时可能会出现一些延迟。为此,您应该考虑使用UIActivityIndicatorView来显示“正在加载数据”类型的指标,以便用户反馈您的应用正在执行某些操作但未冻结。或者,您可以使用Xamarin Component Store中的BTProgressHUD,它非常易于使用