Swift动态获取成员变量及对象关联

来源:互联网 发布:淘宝女装推荐 编辑:程序博客网 时间:2024/05/16 17:51

1.动态获取成员变量,以tabBarItem.badgeValue为例,由于Oc中的写法和Swift中的写法类似,这里就不写Oc的Demo了

self.tabBarItem.badgeValue = "10"//拿到显示badgeValue的控件//1拿到tabbarfor 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.对象关联,还是以item为例,动态给item绑定一个属性index

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");





0 0