当我离开页面时是否会调用OnElementChanged()控件?

Ala*_*an2 6 c# xamarin xamarin.forms

我在页面上使用这个iOS SegmentedControlRenderer.

但是当我以这种方式访问​​页面时:Navigation.PushAsync(new CFSPage())然后单击后退箭头转到上一页,我的客户iOS渲染器中的OnElementChanged事件被触发.我的渲染器的结果是以下行给出了一个空引用错误:

segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();

有人可以解释一下这个目的是什么?这里也应该在if (e.NewElement != null)检查之后或者它应该在支票内.我在说,下面几行应该纠正NOT如果没有为newElement被执行?

segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();
SetNativeControl(segmentedControl);
SetSelectedSegment();
Run Code Online (Sandbox Code Playgroud)

这个渲染器没有

protected override void Dispose(bool disposing)
Run Code Online (Sandbox Code Playgroud)

那是不是缺少的东西?

渲染

public class SegmentedControlRenderer : ViewRenderer<SegmentedControl, UISegmentedControl>
{
    protected override void OnElementChanged(ElementChangedEventArgs<SegmentedControl> e)
    {
        base.OnElementChanged(e);
        UISegmentedControl segmentedControl = null;
        if (Control == null)
        {
            segmentedControl = new UISegmentedControl();
            for (var i = 0; i < e.NewElement.Children.Count; i++)
            {
             segmentedControl.InsertSegment(Element.Children[i].Text, i, false);
            }
            SetNativeControl(segmentedControl);
            SetSelectedSegment();
        }
        if (e.OldElement != null)
        {
            if (segmentedControl != null)
                segmentedControl.ValueChanged -= NativeValueChanged;
        }
        if (e.NewElement != null)
        {
            segmentedControl.ValueChanged += NativeValueChanged;
        }
        segmentedControl.TintColor = e.NewElement?.TintColor.ToUIColor();
        SetNativeControl(segmentedControl);
        SetSelectedSegment();
    }

    protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
    {
        base.OnElementPropertyChanged(sender, e);

        if (e.PropertyName == nameof(SegmentedControl.SelectedSegment))
            SetSelectedSegment();
        if (e.PropertyName == SegmentedControl.TintColorProperty.PropertyName)
            SetSegmentTintColor();
    }

    void NativeValueChanged(object sender, EventArgs e)
    {
        if (Element is SegmentedControl formsElement)
        {
            formsElement.SelectedSegment = (int)Control.SelectedSegment;
        };
    }

    void SetSegmentTintColor()
    {
        if (Element is SegmentedControl formsElement)
            Control.TintColor = formsElement.TintColor.ToUIColor();
    }

    void SetSelectedSegment()
    {
        if (Element is SegmentedControl formsElement)
        {
            if (formsElement.SelectedSegment >= 0 && formsElement.SelectedSegment < Control.NumberOfSegments)
                Control.SelectedSegment = formsElement.SelectedSegment;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ben*_*enl 4

OnElementChanged以下是大多数渲染器的结构示例:

protected override void OnElementChanged(ElementChangedEventArgs<Type> e)
{
    base.OnElementChanged(e);

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

    if (e.NewElement != null)
    {
        if (Control == null)
        {
            // Instantiate the native control and assign it to the Control property with
            // the SetNativeControl method
        }

        // Configure the control and subscribe to event handlers
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,Control当为 true 时,可能为 null if (e.OldElement != null),并且在这种情况下通常不应重新创建。

另请参阅Xamarin.Forms iOS ButtonRenderer