diff --git a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs index e4c8a6ab8752..d73c54eac9a0 100644 --- a/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs +++ b/src/Controls/src/Core/Handlers/Items/iOS/ItemsViewController.cs @@ -11,7 +11,7 @@ namespace Microsoft.Maui.Controls.Handlers.Items { - public abstract class ItemsViewController : UICollectionViewController, MauiCollectionView.ICustomMauiCollectionViewDelegate + public abstract class ItemsViewController : UICollectionViewController where TItemsView : ItemsView { public const int EmptyTag = 333; @@ -89,6 +89,8 @@ protected override void Dispose(bool disposing) if (disposing) { ItemsSource?.Dispose(); + + ((IUIViewLifeCycleEvents)CollectionView).MovedToWindow -= MovedToWindow; CollectionView.Delegate = null; Delegator?.Dispose(); @@ -187,10 +189,22 @@ public override void LoadView() { base.LoadView(); var collectionView = new MauiCollectionView(CGRect.Empty, ItemsViewLayout); - collectionView.SetCustomDelegate(this); + ((IUIViewLifeCycleEvents)collectionView).MovedToWindow += MovedToWindow; CollectionView = collectionView; } + private void MovedToWindow(object sender, EventArgs e) + { + if (CollectionView?.Window != null) + { + AttachingToWindow(); + } + else + { + DetachingFromWindow(); + } + } + public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); @@ -275,18 +289,6 @@ bool IsRefreshing() return false; } - void MauiCollectionView.ICustomMauiCollectionViewDelegate.MovedToWindow(UIView view) - { - if (CollectionView?.Window != null) - { - AttachingToWindow(); - } - else - { - DetachingFromWindow(); - } - } - void InvalidateMeasureIfContentSizeChanged() { var contentSize = CollectionView?.CollectionViewLayout?.CollectionViewContentSize; diff --git a/src/Controls/src/Core/Handlers/Items/iOS/MauiCollectionView.cs b/src/Controls/src/Core/Handlers/Items/iOS/MauiCollectionView.cs index ee8ceb04c568..b278d9407b67 100644 --- a/src/Controls/src/Core/Handlers/Items/iOS/MauiCollectionView.cs +++ b/src/Controls/src/Core/Handlers/Items/iOS/MauiCollectionView.cs @@ -5,11 +5,11 @@ namespace Microsoft.Maui.Controls.Handlers.Items; -internal class MauiCollectionView : UICollectionView, IUIViewLifeCycleEvents, IPlatformMeasureInvalidationController +public class MauiCollectionView : UICollectionView, IUIViewLifeCycleEvents, IPlatformMeasureInvalidationController { bool _invalidateParentWhenMovedToWindow; - WeakReference? _customDelegate; + readonly WeakEventManager _movedToWindowEventManager = new(); internal bool NeedsCellLayout { get; set; } @@ -40,23 +40,16 @@ bool IPlatformMeasureInvalidationController.InvalidateMeasure(bool isPropagating } [UnconditionalSuppressMessage("Memory", "MEM0002", Justification = IUIViewLifeCycleEvents.UnconditionalSuppressMessage)] - EventHandler? _movedToWindow; - event EventHandler? IUIViewLifeCycleEvents.MovedToWindow { - add => _movedToWindow += value; - remove => _movedToWindow -= value; + add => _movedToWindowEventManager.AddEventHandler(value); + remove => _movedToWindowEventManager.RemoveEventHandler(value); } public override void MovedToWindow() { base.MovedToWindow(); - _movedToWindow?.Invoke(this, EventArgs.Empty); - - if (_customDelegate?.TryGetTarget(out var target) == true) - { - target.MovedToWindow(this); - } + _movedToWindowEventManager.HandleEvent(this, EventArgs.Empty, nameof(IUIViewLifeCycleEvents.MovedToWindow)); if (_invalidateParentWhenMovedToWindow) { @@ -64,15 +57,4 @@ public override void MovedToWindow() this.InvalidateAncestorsMeasures(); } } - - internal void SetCustomDelegate(ICustomMauiCollectionViewDelegate customDelegate) - { - _customDelegate = new WeakReference(customDelegate); - } - - - internal interface ICustomMauiCollectionViewDelegate - { - void MovedToWindow(UIView view); - } } \ No newline at end of file diff --git a/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cs b/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cs index 23b8511d789e..d1dcaa40ec98 100644 --- a/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cs +++ b/src/Controls/src/Core/Handlers/Items2/iOS/ItemsViewController2.cs @@ -13,7 +13,7 @@ namespace Microsoft.Maui.Controls.Handlers.Items2 { - public abstract class ItemsViewController2 : UICollectionViewController, Items.MauiCollectionView.ICustomMauiCollectionViewDelegate + public abstract class ItemsViewController2 : UICollectionViewController where TItemsView : ItemsView { public const int EmptyTag = 333; @@ -90,6 +90,8 @@ protected override void Dispose(bool disposing) { ItemsSource?.Dispose(); + ((IUIViewLifeCycleEvents)CollectionView).MovedToWindow -= MovedToWindow; + CollectionView.Delegate = null; Delegator?.Dispose(); @@ -186,7 +188,7 @@ public override void LoadView() { base.LoadView(); var collectionView = new Items.MauiCollectionView(CGRect.Empty, ItemsViewLayout); - collectionView.SetCustomDelegate(this); + ((IUIViewLifeCycleEvents)collectionView).MovedToWindow += MovedToWindow; CollectionView = collectionView; } @@ -228,7 +230,7 @@ void InvalidateLayoutIfItemsMeasureChanged() } } - void Items.MauiCollectionView.ICustomMauiCollectionViewDelegate.MovedToWindow(UIView view) + private void MovedToWindow(object sender, EventArgs e) { if (CollectionView?.Window != null) { diff --git a/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt index f09fef6121d6..bc5ccef627a3 100644 --- a/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-ios/PublicAPI.Unshipped.txt @@ -1,4 +1,8 @@ #nullable enable +Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView +Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView.MauiCollectionView(CoreGraphics.CGRect frame, UIKit.UICollectionViewLayout! layout) -> void +override Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView.MovedToWindow() -> void +override Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView.ScrollRectToVisible(CoreGraphics.CGRect rect, bool animated) -> void Microsoft.Maui.Controls.LayoutConstraint Microsoft.Maui.Controls.LayoutConstraint.Fixed = Microsoft.Maui.Controls.LayoutConstraint.HorizontallyFixed | Microsoft.Maui.Controls.LayoutConstraint.VerticallyFixed -> Microsoft.Maui.Controls.LayoutConstraint Microsoft.Maui.Controls.LayoutConstraint.HorizontallyFixed = 1 -> Microsoft.Maui.Controls.LayoutConstraint diff --git a/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt b/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt index 26b3318ad9f6..bb86842646fc 100644 --- a/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt +++ b/src/Controls/src/Core/PublicAPI/net-maccatalyst/PublicAPI.Unshipped.txt @@ -1,4 +1,8 @@ #nullable enable +Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView +Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView.MauiCollectionView(CoreGraphics.CGRect frame, UIKit.UICollectionViewLayout! layout) -> void +override Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView.MovedToWindow() -> void +override Microsoft.Maui.Controls.Handlers.Items.MauiCollectionView.ScrollRectToVisible(CoreGraphics.CGRect rect, bool animated) -> void Microsoft.Maui.Controls.LayoutConstraint Microsoft.Maui.Controls.LayoutConstraint.Fixed = Microsoft.Maui.Controls.LayoutConstraint.HorizontallyFixed | Microsoft.Maui.Controls.LayoutConstraint.VerticallyFixed -> Microsoft.Maui.Controls.LayoutConstraint Microsoft.Maui.Controls.LayoutConstraint.HorizontallyFixed = 1 -> Microsoft.Maui.Controls.LayoutConstraint