swift获取Controller或者View的方法

递归获取当前view中某个view

        /// 获取lineView
        ///
        /// - Parameter view: 父view
        /// - Returns: wantView
        func findSubView (view: UIView){
            for subview in view.subviews {
                if subview.tag == 999 {//此处以tag对某个view标识
                }
                findSubView(view: subview)
            }
        }
        
        DispatchQueue.mainAsync {
            findSubView(view: alert)
        }

获取window中最顶层控制器

    //获取当前页面的最顶层控制器
   func currentVc() -> UIViewController {
        let keywindow = UIApplication.shared.keyWindow
        let firstView: UIView = (keywindow?.subviews.first)!
        let secondView: UIView = firstView.subviews.first!
        let vc = viewForController(view: secondView)
        return vc!
    }

    func viewForController(view:UIView)->UIViewController?{
        var next:UIView? = view
        repeat{
            if let nextResponder = next?.next, nextResponder is UIViewController {
                return (nextResponder as! UIViewController)
            }
            next = next?.superview
        }while next != nil
        return nil
    }
    

调用方式:

    let vc = self.currentVc()//获取当前屏幕中顶层控制器
    if vc.childViewControllers.first is ManagerRootViewController {
         self.perform(#selector(ManagerRootViewController.disAction), on: Thread.main, with: nil, waitUntilDone: true)
    }//如果是UINavgitionController,那么其first就是rootViewController

Perform的使用:

    在A控制器想让B控制器调用B中xx的方法,perform的用法
    onThread:执行xx方法的线程
    waitUntilDone:true代表先执行xx方法再执行一下代码.

你可能感兴趣的:(swift获取Controller或者View的方法)