diff --git a/ReactiveUI/Cocoa/ReactiveCollectionView.cs b/ReactiveUI/Cocoa/ReactiveCollectionView.cs index 665d24c73b..e0d6e4a55a 100644 --- a/ReactiveUI/Cocoa/ReactiveCollectionView.cs +++ b/ReactiveUI/Cocoa/ReactiveCollectionView.cs @@ -21,7 +21,7 @@ namespace ReactiveUI { public abstract class ReactiveCollectionView : UICollectionView, - IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate + IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate, ICanForceManualActivation { protected ReactiveCollectionView(RectangleF frame, UICollectionViewLayout layout) : base(frame, layout) { setupRxObj(); } protected ReactiveCollectionView(IntPtr handle) : base(handle) { setupRxObj(); } @@ -97,5 +97,9 @@ public override void RemoveFromSuperview() base.RemoveFromSuperview(); deactivated.OnNext(Unit.Default); } + + void ICanForceManualActivation.Activate(bool activate) { + RxApp.MainThreadScheduler.Schedule(() => (activate ? activated : deactivated).OnNext(Unit.Default)); + } } } diff --git a/ReactiveUI/Cocoa/ReactiveCollectionViewController.cs b/ReactiveUI/Cocoa/ReactiveCollectionViewController.cs index dae546bd75..417a5c9243 100644 --- a/ReactiveUI/Cocoa/ReactiveCollectionViewController.cs +++ b/ReactiveUI/Cocoa/ReactiveCollectionViewController.cs @@ -92,12 +92,14 @@ public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); activated.OnNext(Unit.Default); + this.ActivateSubviews(true); } public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); deactivated.OnNext(Unit.Default); + this.ActivateSubviews(false); } } } diff --git a/ReactiveUI/Cocoa/ReactiveControl.cs b/ReactiveUI/Cocoa/ReactiveControl.cs index e52b2032f5..d511a5ba95 100644 --- a/ReactiveUI/Cocoa/ReactiveControl.cs +++ b/ReactiveUI/Cocoa/ReactiveControl.cs @@ -16,7 +16,7 @@ namespace ReactiveUI { - public class ReactiveControl : UIControl, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate + public class ReactiveControl : UIControl, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate, ICanForceManualActivation { protected ReactiveControl() : base() { @@ -105,5 +105,9 @@ public override void ViewWillMoveToSuperview(NSView newsuper) #endif RxApp.MainThreadScheduler.Schedule(() => (newsuper != null ? activated : deactivated).OnNext(Unit.Default)); } + + void ICanForceManualActivation.Activate(bool activate) { + RxApp.MainThreadScheduler.Schedule(() => (activate ? activated : deactivated).OnNext(Unit.Default)); + } } } diff --git a/ReactiveUI/Cocoa/ReactiveImageView.cs b/ReactiveUI/Cocoa/ReactiveImageView.cs index 8fcf3aad23..93b8bef544 100644 --- a/ReactiveUI/Cocoa/ReactiveImageView.cs +++ b/ReactiveUI/Cocoa/ReactiveImageView.cs @@ -28,7 +28,7 @@ namespace ReactiveUI { - public abstract class ReactiveImageView : NSImageView, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate + public abstract class ReactiveImageView : NSImageView, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate, ICanForceManualActivation { public ReactiveImageView(RectangleF frame) : base(frame) { } public ReactiveImageView(IntPtr handle) : base(handle) { } @@ -100,6 +100,10 @@ public override void ViewWillMoveToSuperview(NSView newsuper) #endif RxApp.MainThreadScheduler.Schedule(() => (newsuper != null ? activated : deactivated).OnNext(Unit.Default)); } + + void ICanForceManualActivation.Activate(bool activate) { + RxApp.MainThreadScheduler.Schedule(() => (activate ? activated : deactivated).OnNext(Unit.Default)); + } } } diff --git a/ReactiveUI/Cocoa/ReactiveNSView.cs b/ReactiveUI/Cocoa/ReactiveNSView.cs index bfa4e27b04..da12d41fbe 100644 --- a/ReactiveUI/Cocoa/ReactiveNSView.cs +++ b/ReactiveUI/Cocoa/ReactiveNSView.cs @@ -29,7 +29,7 @@ namespace ReactiveUI /// This is an View that is both an NSView and has ReactiveObject powers /// (i.e. you can call RaiseAndSetIfChanged) /// - public class ReactiveView : NSView, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate + public class ReactiveView : NSView, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate, ICanForceManualActivation { protected ReactiveView() : base() { @@ -121,5 +121,9 @@ public override void ViewWillMoveToSuperview(NSView newsuper) #endif RxApp.MainThreadScheduler.Schedule(() => (newsuper != null ? activated : deactivated).OnNext(Unit.Default)); } + + void ICanForceManualActivation.Activate(bool activate) { + RxApp.MainThreadScheduler.Schedule(() => (activate ? activated : deactivated).OnNext(Unit.Default)); + } } } diff --git a/ReactiveUI/Cocoa/ReactiveNSViewController.cs b/ReactiveUI/Cocoa/ReactiveNSViewController.cs index b9f01a3c92..6a4179b0fd 100644 --- a/ReactiveUI/Cocoa/ReactiveNSViewController.cs +++ b/ReactiveUI/Cocoa/ReactiveNSViewController.cs @@ -114,13 +114,34 @@ public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); activated.OnNext(Unit.Default); + this.ActivateSubviews(true); } public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); deactivated.OnNext(Unit.Default); + this.ActivateSubviews(false); } #endif } + + static class UIViewControllerMixins { + internal static void ActivateSubviews(this UIViewController This, bool activate) + { + This.View.ActivateSubviews(activate); + } + + private static void ActivateSubviews(this UIView This, bool activate) + { + foreach (var view in This.Subviews) { + var subview = view as ICanForceManualActivation; + if (subview != null) { + subview.Activate(activate); + } + + view.ActivateSubviews(activate); + } + } + } } diff --git a/ReactiveUI/Cocoa/ReactivePageViewController.cs b/ReactiveUI/Cocoa/ReactivePageViewController.cs index 4367358186..fbd21853a6 100644 --- a/ReactiveUI/Cocoa/ReactivePageViewController.cs +++ b/ReactiveUI/Cocoa/ReactivePageViewController.cs @@ -95,12 +95,14 @@ public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); activated.OnNext(Unit.Default); + this.ActivateSubviews(true); } public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); deactivated.OnNext(Unit.Default); + this.ActivateSubviews(false); } } } diff --git a/ReactiveUI/Cocoa/ReactiveTabBarController.cs b/ReactiveUI/Cocoa/ReactiveTabBarController.cs index d9b87b2ab9..5036a8fee0 100644 --- a/ReactiveUI/Cocoa/ReactiveTabBarController.cs +++ b/ReactiveUI/Cocoa/ReactiveTabBarController.cs @@ -91,12 +91,14 @@ public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); activated.OnNext(Unit.Default); + this.ActivateSubviews(true); } public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); deactivated.OnNext(Unit.Default); + this.ActivateSubviews(false); } } } diff --git a/ReactiveUI/Cocoa/ReactiveTableView.cs b/ReactiveUI/Cocoa/ReactiveTableView.cs index f2b42e4114..cf38e29aea 100644 --- a/ReactiveUI/Cocoa/ReactiveTableView.cs +++ b/ReactiveUI/Cocoa/ReactiveTableView.cs @@ -21,7 +21,7 @@ namespace ReactiveUI { - public abstract class ReactiveTableView : UITableView, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate + public abstract class ReactiveTableView : UITableView, IReactiveNotifyPropertyChanged, IHandleObservableErrors, IReactiveObject, ICanActivate, ICanForceManualActivation { public ReactiveTableView(RectangleF frame) : base(frame) { } public ReactiveTableView(IntPtr handle) : base(handle) { } @@ -82,6 +82,10 @@ public override void WillMoveToSuperview(UIView newsuper) base.WillMoveToSuperview(newsuper); RxApp.MainThreadScheduler.Schedule(() => (newsuper != null ? activated : deactivated).OnNext(Unit.Default)); } + + void ICanForceManualActivation.Activate(bool activate) { + RxApp.MainThreadScheduler.Schedule(() => (activate ? activated : deactivated).OnNext(Unit.Default)); + } } } diff --git a/ReactiveUI/Cocoa/ReactiveTableViewController.cs b/ReactiveUI/Cocoa/ReactiveTableViewController.cs index 103c09e444..bbe50b259b 100644 --- a/ReactiveUI/Cocoa/ReactiveTableViewController.cs +++ b/ReactiveUI/Cocoa/ReactiveTableViewController.cs @@ -94,12 +94,14 @@ public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); activated.OnNext(Unit.Default); + this.ActivateSubviews(true); } public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); deactivated.OnNext(Unit.Default); + this.ActivateSubviews(false); } } } diff --git a/ReactiveUI/Interfaces.cs b/ReactiveUI/Interfaces.cs index a63b4210c6..7a17d07094 100644 --- a/ReactiveUI/Interfaces.cs +++ b/ReactiveUI/Interfaces.cs @@ -452,6 +452,10 @@ public interface ICanActivate IObservable Deactivated { get; } } + internal interface ICanForceManualActivation { + void Activate(bool activate); + } + /// /// Allows an additional string to make view resolution more specific than /// just a type.