#pragma once #include #include namespace NXKit { class UIViewController: public UIResponder, public UITraitEnvironment, public UIFocusEnvironment, public enable_shared_from_this { public: std::map> idStorage; void setView(std::shared_ptr view); std::shared_ptr view(); bool viewIsLoaded(); void loadViewIfNeeded(); std::shared_ptr next() override; // Most of these methods are designed to be overriden in `UIViewController` subclasses virtual void loadView(); virtual void viewDidLoad() {} virtual void viewWillAppear(bool animated); virtual void viewDidAppear(bool animated); virtual void viewWillDisappear(bool animated); virtual void viewDidDisappear(bool animated); virtual void viewSafeAreaInsetsDidChange() {} virtual void viewLayoutMarginsDidChange() {} virtual void viewWillLayoutSubviews() {} virtual void viewDidLayoutSubviews() {} std::vector> children() { return _children; } std::weak_ptr parent() { return _parent; } std::string title() { return _title; } void setTitle(std::string title) { _title = std::move(title); } void addChild(const std::shared_ptr& child); virtual void willMoveToParent(const std::shared_ptr& parent); virtual void didMoveToParent(std::shared_ptr parent); void removeFromParent(); UIEdgeInsets additionalSafeAreaInsets() { return _additionalSafeAreaInsets; } void setAdditionalSafeAreaInsets(UIEdgeInsets additionalSafeAreaInsets); UIEdgeInsets systemMinimumLayoutMargins() { return _systemMinimumLayoutMargins; } bool viewRespectsSystemMinimumLayoutMargins() const { return _viewRespectsSystemMinimumLayoutMargins; } void setViewRespectsSystemMinimumLayoutMargins(bool viewRespectsSystemMinimumLayoutMargins); void present(const std::shared_ptr& otherViewController, bool animated, const std::function& completion = [](){}); void dismiss(bool animated, const std::function& completion = [](){}); void traitCollectionDidChange(std::shared_ptr previousTraitCollection) override; // Focus std::shared_ptr parentFocusEnvironment() override; protected: virtual void makeViewAppear(bool animated, std::shared_ptr presentingViewController, std::function completion = [](){}); virtual void makeViewDisappear(bool animated, std::function completion); private: std::shared_ptr _view; std::weak_ptr _parent; std::vector> _children; UIEdgeInsets _additionalSafeAreaInsets; UIEdgeInsets _systemMinimumLayoutMargins = UIEdgeInsets(0, 16, 0, 16); bool _viewRespectsSystemMinimumLayoutMargins = true; float _animationTime = 0.5; std::string _title = ""; std::shared_ptr _presentedViewController; std::weak_ptr _presentingViewController; std::shared_ptr rootVC(); }; }