Вызывается ли элемент управления OnElementChanged (), когда я покидаю страницу? - PullRequest
0 голосов
/ 16 сентября 2018

Я использую этот iOS SegmentedControlRenderer на странице.

Но когда я перехожу на страницу следующим образом: Navigation.PushAsync(new CFSPage()) и затем нажимаю на стрелку назад, чтобы перейти на предыдущую страницу, происходит событие OnElementChanged в моем клиентском рендерере iOS. В результате с моим рендерером следующая строка выдает нулевую ссылку:

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

Может кто-нибудь объяснить, в чем цель? здесь и также эта строка должна быть после или должна быть внутри проверки if (e.NewElement != null). Правильно ли я сказал, что следующие строки должны НЕ выполняться, если нет NewElement?

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

Этот рендер не имеет

protected override void Dispose(bool disposing)

Это чего-то не хватает?

Renderer

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;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Ниже приведен пример структуры 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
    }
}

Обратите внимание, что Control может быть нулевым, если if (e.OldElement != null) имеет значение true, и его обычно не следует создавать заново в этой ситуации.

См. Также Xamarin.Forms iOS ButtonRenderer .

0 голосов
/ 16 сентября 2018

? можно найти по адресу C # 6,0 документов :

Вам необходимо проверять каждый доступ к переменным, чтобы убедиться, что вы не разыменование null. Пустой условный оператор делает эти проверки намного проще и плавнее.

Просто замените членский доступ . на ?.

Короче говоря:

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

совпадает с:

  if (e.NewElement != null)
  {
      segmentedControl.TintColor = e.NewElement.TintColor.ToUIColor();
  }

Так что да, вы правы, он не должен выполняться, если есть NewElement.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...