利用runtime获取某个类的属性及方法列表

2018-06-19  本文已影响0人  izsm

如何利用反射机制获取某个类的属性及方法列表:

extension NSObject {
    
    /// 获取某个类的方法列表
    ///
    /// - Parameter className: 类
    /// - Returns: 某个类的方法列表
    func getMethod(className: AnyClass) -> [Selector]? {
        
        var outCount: UInt32 = 0
        guard let methods = class_copyMethodList(className, &outCount) else { return nil }
        
        var methodArray = [Selector]()
        let count = Int(outCount)
        for i in 0...(count - 1) {
            let aMet = methods[i]
            let methodName  = method_getName(aMet)
            methodArray.append(methodName)
        }
        return methodArray
    }
    
    /// 获取某个类的属性列表
    ///
    /// - Parameter className: 类
    /// - Returns: 某个类的属性列表
    func getProperty(className: AnyClass) -> [String]? {
        
        var outCount: UInt32 = 0
        guard let propers = class_copyPropertyList(className, &outCount) else { return nil }
        
        var propertyArray = [String]()
        let count: Int = Int(outCount)
        for i in 0...(count - 1) {
            let aPro = propers[i]
            if let proName = String(utf8String: property_getName(aPro)) {
                propertyArray.append(proName)
            }
        }
        return propertyArray
    }
}

使用:

比如修改 UIDatePicker 的文字颜色

先调用 getProperty 方法获取属性列表:

getProperty(className: UIDatePicker.self)

打印其属性如下:

[
"hash",
 "superclass",
 "description",
 "debugDescription",
 "usesBlackChrome",
 "drawsBackground",
 "allowsZeroCountDownDuration",
 "allowsZeroTimeInterval",
 "dateUnderSelectionBar", 
 "contentWidth", 
 "isTimeIntervalMode",
 "useCurrentDateDuringDecoding",
 "_usesModernStyle", 
 "highlightColor",
 "textColor",
 "textShadowColor",
 "timeInterval", 
 "shouldAnimateSetDateCall",
 "datePickerMode",
 "locale", 
 "calendar", 
 "timeZone",
 "date", 
 "minimumDate",
 "maximumDate",
 "countDownDuration", 
 "minuteInterval"
]

修改 “ textColor” 属性就可以改变文字的颜色了

初始化UIDatePicker
private lazy var datePicker: UIDatePicker = {
    let datePicker = UIDatePicker(frame: CGRect(x: 0, y: 50, width: frame.size.width, height: datePickerHeight - 50))
    datePicker.backgroundColor = UIColor.black
    datePicker.datePickerMode = .date
    datePicker.locale = Locale(identifier: "zh_CN")
    datePicker.calendar = Calendar.current
    datePicker.timeZone = TimeZone.current
    datePicker.addTarget(self, action: #selector(chooseDate( _:)), for: .valueChanged)
    datePicker.setValue(UIColor.white, forKey: "textColor")
    return datePicker
}()
修改UIDatePicker文字颜色.png
上一篇下一篇

猜你喜欢

热点阅读