// // UIViewController+Extension.swift // Nextcloud // // Created by Marino Faggiana on 02/08/2022. // Copyright © 2022 Marino Faggiana. All rights reserved. // // Author Marino Faggiana // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // import Foundation import UIKit extension UIViewController { // https://stackoverflow.com/questions/6131205/how-to-find-topmost-view-controller-on-ios @objc func topMostViewController() -> UIViewController { // Handling Modal views if let presentedViewController = self.presentedViewController { return presentedViewController.topMostViewController() } // Handling UIViewController's added as subviews to some other views. else { for view in self.view.subviews { // Key property which most of us are unaware of / rarely use. if let subViewController = view.next { if subViewController is UIViewController { if let viewController = subViewController as? UIViewController { return viewController.topMostViewController() } } } } return self } } // https://stackoverflow.com/questions/23620276/how-to-check-if-a-view-controller-is-presented-modally-or-pushed-on-a-navigation var isModal: Bool { if let index = navigationController?.viewControllers.firstIndex(of: self), index > 0 { return false } else if presentingViewController != nil { return true } else if navigationController?.presentingViewController?.presentedViewController == navigationController { return true } else if tabBarController?.presentingViewController is UITabBarController { return true } else { return false } } }