1.动态获取成员变量,以tabBarItem.badgeValue为例,由于Oc中的写法和Swift中的写法类似,这里就不写Oc的Demo了
self.tabBarItem.badgeValue = "10"
//拿到显示badgeValue的控件
//1拿到tabbar
for tabBarChild in self.tabBarController!.tabBar.subviews {
//拿到UITabBarButton
if tabBarChild.isKindOfClass(NSClassFromString("UITabBarButton")!) {
for tabBarButtonChild in tabBarChild.subviews {
//拿到_UIBadgeView
if tabBarButtonChild.isKindOfClass(NSClassFromString("_UIBadgeView")!) {
for badgeViewChild in tabBarButtonChild.subviews {
if badgeViewChild.isKindOfClass(NSClassFromString("_UIBadgeBackground")!) {
printLog("哈哈,终于拿到你了")
// badgeViewChild.backgroundColor = UIColor.orangeColor()
var count: UInt32 = 0
//获取到类身上的实例变量,也叫成员变量
let ivars = class_copyIvarList(NSClassFromString("_UIBadgeBackground"), &count)
for i in 0..<count {
//取某一个实例变量
let ivar = ivars[Int(i)]
//获取ivar的名称
let ivarName = NSString(CString: ivar_getName(ivar), encoding: NSUTF8StringEncoding)
//获取ivar的类型
let ivarType = NSString(CString: ivar_getTypeEncoding(ivar), encoding: NSUTF8StringEncoding)
printLog("name=\(ivarName);;type=\(ivarType)")
if ivarName!.isEqualToString("_image") {
badgeViewChild.setValue(UIImage(named: "main_badge"), forKeyPath: (ivarName! as String))
}
}
}
}
}
}
}
}
2.1Swift写法
*对象关联:把一个对象A通过一个key关联到对象B身上去.而我们要从B身上取这个对象的话,就可以通过这个key
//定义一个对象关联的key
private var TABBAR_INDEX_KEY = UnsafePointer<Void>()
*存:objc_setAssociatedObject(item, &TABBAR_INDEX_KEY, NSNumber(integer: index), objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN)
*取:let result = objc_getAssociatedObject(item, &TABBAR_INDEX_KEY)
2.2Oc中的写法
Oc中需要导入头文件,在设置一个字符串就可以了
#import <objc/runtime.h>
objc_setAssociatedObject(self, @"hehe", [NSNumber numberWithInt:1], OBJC_ASSOCIATION_ASSIGN);
objc_getAssociatedObject(self, @"hehe");