Xamarin iOS渲染器中用于“ if(Control == null)”部分的内容是什么?

时间:2019-02-08 06:42:13

标签: xamarin xamarin.forms

看看Xamarin的示例片段,我发现他们建议创建一个包含三个部分的自定义渲染器:

  1. 如果(Control == null)

  2. 如果(e.OldElement!= null)

  3. 如果(e.NewElement!= null)

我的渲染器看起来像这样。但是,我不明白我将使用if (Control == null)部分做什么。

问题1)?有人可以给我建议如何使用它,以及我的实现是否有误?

问题2),我是否正确实施了此操作,以及如何/在何处删除OnTabbarControllerItemSelected处理程序?

问题3):“控制”元素来自何处?这与我称为_page或元素e的变量相同吗?

tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;

public class TabbedPageRenderer : TabbedRenderer
{
    private MainPage _page;

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        //if (Control == null)
        //{
        //    // Instantiate the native control
        //}

        if (e.OldElement != null)
        {
            // Unsubscribe from event handlers and cleanup any resources
            e.OldElement.PropertyChanged -= Current_PropertyChanged;
            return;
        }

        if (e.NewElement != null)
        {
            // Configure the control and subscribe to event handlers
            TabBar.Translucent = false;
            TabBar.BackgroundImage = new UIImage();
            _page = (MainPage)e.NewElement;
            e.NewElement.PropertyChanged += Current_PropertyChanged;
        }

        try
        {
            var tabbarController = (UITabBarController)this.ViewController;
            if (tabbarController != null)
            {
                tabbarController.ViewControllerSelected += OnTabbarControllerItemSelected;
                UpdateTheme();
            }
        }
        catch (Exception exception)
        {
            Console.WriteLine(exception);
        }
    }

    private void OnTabbarControllerItemSelected(object sender, UITabBarSelectionEventArgs eventArgs)
    {
        if (!(_page.CurrentPage is Japanese.CardsTabPage) && App.quizRunning == true)
            _page.CurrentPage = App.navCardsTabPage;
    }

    void Current_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Theme")
            UpdateTheme();
    }

    void UpdateTheme()
    {
        switch (_page.Theme)
        {
            default:
            case TH.Light:
                TabBar.SelectedImageTintColor = UIColor.Red;
                break;
            case TH.Dark: 
                TabBar.SelectedImageTintColor = UIColor.Red;
                break;
        }
    }

}

1 个答案:

答案 0 :(得分:2)

  

问题1和3

该代码段用于编写自定义渲染器,Control属性在ViewRenderer类中。由于您的控件继承自TabbedRenderer,因此无需遵循摘要。

  

问题2

ViewController属性返回TabbedRenderer本身,因此您不需要每次调用OnElementChanged时都添加侦听器。考虑将其移至构造函数。

赞:

public class TabbedPageRenderer : TabbedRenderer
{
    private MainPage _page;

    public TabbedPageRenderer()
    {
        this.ViewControllerSelected += OnTabbarControllerItemSelected;
    }

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        if (e.OldElement != null)
        {
            // Unsubscribe from event handlers and cleanup any resources
            e.OldElement.PropertyChanged -= Current_PropertyChanged;
            return;
        }

        if (e.NewElement != null)
        {
            // Configure the control and subscribe to event handlers
            TabBar.Translucent = false;
            TabBar.BackgroundImage = new UIImage();
            _page = (MainPage)e.NewElement;
            e.NewElement.PropertyChanged += Current_PropertyChanged;
        }

        if(_page != null)
            UpdateTheme();
    }

    private void OnTabbarControllerItemSelected(object sender, UITabBarSelectionEventArgs eventArgs)
    {
        if (_page != null && !(_page.CurrentPage is Japanese.CardsTabPage) && App.quizRunning == true)
            _page.CurrentPage = App.navCardsTabPage;
    }

    void Current_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Theme")
            UpdateTheme();
    }

    void UpdateTheme()
    {
        switch (_page.Theme)
        {
            default:
            case TH.Light:
                TabBar.SelectedImageTintColor = UIColor.Red;
                break;
            case TH.Dark: 
                TabBar.SelectedImageTintColor = UIColor.Red;
                break;
        }
    }
}