Я использую этот 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;
}
}
}