using System; using ReactiveUI; using System.Reactive.Subjects; using System.Reactive.Linq; using Foundation; using System.Reactive; namespace CodeHub.iOS.ViewControllers { public abstract class BaseViewController : ReactiveViewController, IActivatable { private readonly ISubject _appearingSubject = new Subject(); private readonly ISubject _appearedSubject = new Subject(); private readonly ISubject _disappearingSubject = new Subject(); private readonly ISubject _disappearedSubject = new Subject(); private readonly ISubject _loadedSubject = new Subject(); #if DEBUG ~BaseViewController() { Console.WriteLine("All done with " + GetType().Name); } #endif public IObservable Loaded => _loadedSubject.AsObservable(); public IObservable Appearing => _appearingSubject.AsObservable(); public IObservable Appeared => _appearedSubject.AsObservable(); public IObservable Disappearing => _disappearingSubject.AsObservable(); public IObservable Disappeared => _disappearedSubject.AsObservable(); public void OnActivation(Action> d) { this.WhenActivated(d); } protected BaseViewController() { CommonConstructor(); } protected BaseViewController(string nib, NSBundle bundle) : base(nib, bundle) { CommonConstructor(); } private void CommonConstructor() { this.WhenActivated(_ => { }); } public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); _appearingSubject.OnNext(animated); } public override void ViewDidAppear(bool animated) { base.ViewDidAppear(animated); _appearedSubject.OnNext(animated); } public override void ViewWillDisappear(bool animated) { base.ViewWillDisappear(animated); _disappearingSubject.OnNext(animated); } public override void ViewDidDisappear(bool animated) { base.ViewDidDisappear(animated); _disappearedSubject.OnNext(animated); } public override void ViewDidLoad() { base.ViewDidLoad(); _loadedSubject.OnNext(Unit.Default); } } }