ios - UITabBarController 等待加载 UIViewController 直到选择 Xamarin

标签 ios xamarin.ios xamarin

是否可以在 UITabBarController 中选择新的 UIViewController 时调用方法?或者是否可以等待加载整个 UIViewController 直到选择 View ?

我有一个 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;
    }

现在,它会加载所有 View ,这将是一个昂贵的调用,当我从虚拟数据转移到每个 View 应加载的真实数据时。所以我只想在 UITabBarController 中选择 View 时进行数据调用。

最佳答案

所以发生的事情是您的 ViewDidLoad() 方法正在为您的构造函数中的每个选项卡 View Controller 触发(假设您正在那里调用您的网络服务)。每个 View Did Load 都在触发,因为您正在调用 View.Background,这会将 View 加载到内存中。你不想在这里这样做,但在每个单独的选项卡 View Controller 的 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
  }
}

现在,如果您的 Web 服务调用成本很高,您可能会在点击选项卡时看到一点延迟。为此,您应该考虑使用 UIActivityIndicatorView显示“加载数据”类型的指示器,以便用户反馈您的应用程序正在做某事而不是卡住。或者,您可以使用 BTProgressHUD来自 Xamarin Component Store,非常易于使用

关于ios - UITabBarController 等待加载 UIViewController 直到选择 Xamarin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28738582/

相关文章:

iOS SDK - 与 socket 建立连接的正确方法?

ios - 如何快速比较颜色

ios - 将 Xamarin 应用程序部署到 iOS 设备

ios - 在 Xamarin iOS 的单页中强制横向模式?

iphone - 如何在 iOS 中获取应用内购买的区域设置货币价格?

iphone - 可以将 cancel/isCancelled 与 GCD/dispatch_async 一起使用吗?

c# - 如何在 monotuch 中从 PerformSegue 传递数据

Xamarin 表单 : Content Page Secondary Toolbar Items in iOS same as Android

ios - Sendbird 未收到推送通知

macos - 在 Xamarin Studio for OS X 中创建 ASP.NET Web API 解决方案