jsdw_ios/QuickLocation/Core/Extension/UIViewController+Extension....

173 lines
5.8 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// UIViewController+Extension.swift
// DLSDK
//
// Created by osell on 2023/8/2.
//
import Foundation
import UIKit
import URLNavigator
extension UIViewController {
/// View Controller
public static var topViewController: UIViewController? {
var keyWindow = UIApplication.keyWindow
if keyWindow == nil {
for window in UIApplication.shared.windows {
if window.isKeyWindow {
keyWindow = window
break
}
}
}
var vc = keyWindow?.rootViewController
while true {
if let nc = vc as? UINavigationController {
vc = nc.visibleViewController
} else if let tbc = vc as? UITabBarController {
if let svc = tbc.selectedViewController {
vc = svc
} else {
break
}
} else if let pvc = vc?.presentedViewController {
vc = pvc
} else {
break
}
}
return vc
}
}
public extension UIViewController {
struct Key {
static var needLogin = "needLoginKey"
}
///
var isNeedLogin: Bool {
get {
objc_getAssociatedObject(self, &Key.needLogin) as? Bool ?? false
}
set {
objc_setAssociatedObject(self, &Key.needLogin, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
// MARK: Storyboard
extension UIViewController {
/// Storyboard ViewController
public static func viewControllerWithIdentifier(_ id: String, storyboardName name: String) -> UIViewController {
let storyboard = UIStoryboard(name: name, bundle: nil)
return storyboard.instantiateViewController(withIdentifier: id)
}
}
extension UIViewController {
class func currentViewController(base: UIViewController? = UIApplication.keyWindow?.rootViewController) -> UIViewController? {
var base = base
if base == nil {
for window in UIApplication.shared.windows {
if window.isKeyWindow {
base = window.rootViewController
break
}
}
}
if let nav = base as? UINavigationController {
return currentViewController(base: nav.visibleViewController)
}
if let tab = base as? UITabBarController {
return currentViewController(base: tab.selectedViewController)
}
if let presented = base?.presentedViewController {
return currentViewController(base: presented)
}
return base
}
}
// MARK: - Toast
extension UIViewController {
static func showErrorToast(message: String) {
#if !SHARE_EXTENSION
// ViewControllerHUD
if let topMostVC = UIViewController.topMost,
ProgressHUD.findProgressHUD(for: topMostVC.view) != nil {
ProgressHUD.dismiss(immediate: true, forController: topMostVC)
}
if message != "" {
ProgressHUD.showError(withStatus: message)
}
else {
ProgressHUD.dismiss()
}
#endif
}
}
// MARK:
extension UIViewController {
func addNavBack() {
let backBtn = UIButton(frame: CGRect(x: 0, y: 0, width: 60, height: 44))
backBtn.setImage(UIImage(named: "navBack"), for: .normal)
backBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: -15, bottom: 0, right: 0)
backBtn.addTarget(self, action: #selector(back), for: .touchUpInside)
let leftItem = UIBarButtonItem(customView: backBtn)
self.navigationItem.leftBarButtonItem = leftItem
// self.navigationItem.leftMargin = 0
}
@objc func back() {
self.navigationController?.popViewController(animated: true)
}
/// view controller push present
@objc
public class func showViewController(_ controller: UIViewController, animated flag: Bool) {
let topViewController = UIViewController.topViewController
if let navigationController = topViewController as? UINavigationController {
navigationController.pushViewController(controller, animated: flag)
} else if let navigationController = topViewController?.navigationController {
navigationController.pushViewController(controller, animated: flag)
} else {
topViewController?.present(controller, animated: flag, completion: nil)
}
}
public static func presentController(_ controller: UIViewController, animated flag: Bool) {
let topViewController = UIViewController.topViewController
topViewController?.present(controller, animated: flag, completion: nil)
}
/// view controller push present
public func showViewControllerAnimated(_ animated: Bool) {
UIViewController.showViewController(self, animated: animated)
}
/// view controller pop dismiss
public static func closeViewControllerAnimated(_ animated: Bool) {
UIViewController.topViewController?.closeViewControllerAnimated(animated)
}
/// view controller pop dismiss
public func closeViewControllerAnimated(_ animated: Bool) {
if let controller = navigationController, controller.viewControllers.count > 1 {
controller.popViewController(animated: animated)
} else {
dismiss(animated: animated, completion: nil)
}
}
}