Get the current first responder without using a private API

前端 未结 28 2278
夕颜
夕颜 2020-11-22 05:03

I submitted my app a little over a week ago and got the dreaded rejection email today. It tells me that my app cannot be accepted because I\'m using a non-public API; specif

28条回答
  •  没有蜡笔的小新
    2020-11-22 05:44

    Here is a Extension implemented in Swift based on Jakob Egger's most excellent answer:

    import UIKit
    
    extension UIResponder {
        // Swift 1.2 finally supports static vars!. If you use 1.1 see: 
        // http://stackoverflow.com/a/24924535/385979
        private weak static var _currentFirstResponder: UIResponder? = nil
        
        public class func currentFirstResponder() -> UIResponder? {
            UIResponder._currentFirstResponder = nil
            UIApplication.sharedApplication().sendAction("findFirstResponder:", to: nil, from: nil, forEvent: nil)
            return UIResponder._currentFirstResponder
        }
        
        internal func findFirstResponder(sender: AnyObject) {
            UIResponder._currentFirstResponder = self
        }
    }
    

    Swift 4

    import UIKit    
    
    extension UIResponder {
        private weak static var _currentFirstResponder: UIResponder? = nil
        
        public static var current: UIResponder? {
            UIResponder._currentFirstResponder = nil
            UIApplication.shared.sendAction(#selector(findFirstResponder(sender:)), to: nil, from: nil, for: nil)
            return UIResponder._currentFirstResponder
        }
        
        @objc internal func findFirstResponder(sender: AnyObject) {
            UIResponder._currentFirstResponder = self
        }
    }
    

提交回复
热议问题