diff options
Diffstat (limited to 'Xamarin.Forms.Platform.iOS')
3 files changed, 113 insertions, 14 deletions
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs index 710aa364..39e7ab77 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs @@ -22,6 +22,7 @@ namespace Xamarin.Forms.Platform.iOS { UIDatePicker _picker; UIColor _defaultTextColor; + bool _disposed; IElementController ElementController => Element as IElementController; @@ -29,7 +30,10 @@ namespace Xamarin.Forms.Platform.iOS { base.OnElementChanged(e); - if (e.OldElement == null) + if (e.NewElement == null) + return; + + if (Control == null) { var entry = new NoCaretField { BorderStyle = UITextBorderStyle.RoundedRect }; @@ -55,13 +59,10 @@ namespace Xamarin.Forms.Platform.iOS SetNativeControl(entry); } - if (e.NewElement != null) - { - UpdateDateFromModel(false); - UpdateMaximumDate(); - UpdateMinimumDate(); - UpdateTextColor(); - } + UpdateDateFromModel(false); + UpdateMaximumDate(); + UpdateMinimumDate(); + UpdateTextColor(); } protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) @@ -120,5 +121,34 @@ namespace Xamarin.Forms.Platform.iOS else Control.TextColor = textColor.ToUIColor(); } + + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + { + _defaultTextColor = null; + + if (_picker != null) + { + _picker.RemoveFromSuperview(); + _picker.ValueChanged -= HandleValueChanged; + _picker.Dispose(); + _picker = null; + } + + if (Control != null) + { + Control.EditingDidBegin -= OnStarted; + Control.EditingDidEnd -= OnEnded; + } + } + + base.Dispose(disposing); + } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs index c0f10d10..0905dcfc 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/PickerRenderer.cs @@ -11,6 +11,7 @@ namespace Xamarin.Forms.Platform.iOS { UIPickerView _picker; UIColor _defaultTextColor; + bool _disposed; IElementController ElementController => Element as IElementController; @@ -139,13 +140,51 @@ namespace Xamarin.Forms.Platform.iOS Control.TextColor = textColor.ToUIColor(); } + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + { + _defaultTextColor = null; + + if (_picker != null) + { + if (_picker.Model != null) + { + _picker.Model.Dispose(); + _picker.Model = null; + } + + _picker.RemoveFromSuperview(); + _picker.Dispose(); + _picker = null; + } + + if (Control != null) + { + Control.EditingDidBegin -= OnStarted; + Control.EditingDidEnd -= OnEnded; + } + + if(Element != null) + ((INotifyCollectionChanged)Element.Items).CollectionChanged -= RowsCollectionChanged; + } + + base.Dispose(disposing); + } + class PickerSource : UIPickerViewModel { - readonly PickerRenderer _renderer; + PickerRenderer _renderer; + bool _disposed; - public PickerSource(PickerRenderer model) + public PickerSource(PickerRenderer renderer) { - _renderer = model; + _renderer = renderer; } public int SelectedIndex { get; internal set; } @@ -183,6 +222,19 @@ namespace Xamarin.Forms.Platform.iOS if(_renderer.Element.On<PlatformConfiguration.iOS>().UpdateMode() == UpdateMode.Immediately) _renderer.UpdatePickerFromModel(this); } + + protected override void Dispose(bool disposing) + { + if (_disposed) + return; + + _disposed = true; + + if (disposing) + _renderer = null; + + base.Dispose(disposing); + } } } }
\ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs index f2632768..bfb96d81 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/TimePickerRenderer.cs @@ -10,17 +10,34 @@ namespace Xamarin.Forms.Platform.iOS { UIDatePicker _picker; UIColor _defaultTextColor; + bool _disposed; IElementController ElementController => Element as IElementController; protected override void Dispose(bool disposing) { + if (_disposed) + return; + + _disposed = true; + if (disposing) { - Control.EditingDidBegin -= OnStarted; - Control.EditingDidEnd -= OnEnded; + _defaultTextColor = null; - _picker.ValueChanged -= OnValueChanged; + if (_picker != null) + { + _picker.RemoveFromSuperview(); + _picker.ValueChanged -= OnValueChanged; + _picker.Dispose(); + _picker = null; + } + + if (Control != null) + { + Control.EditingDidBegin -= OnStarted; + Control.EditingDidEnd -= OnEnded; + } } base.Dispose(disposing); |