首先就是在.m文件导入头文件
#import "objc/runtime.h"
通过RunTime对一个类的成员变量进行遍历
unsigned int numIvars; //成员变量个数
Ivar *vars = class_copyIvarList(NSClassFromString(@"UITextField"), &numIvars);
NSString *key=[NSString new];
for(int i = 0; i < numIvars; i++) {
Ivar thisIvar = vars[i];
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; //获取成员变量的名字
NSLog(@"成员变量的名字 ==== :%@", key);
key = [NSString stringWithUTF8String:ivar_getTypeEncoding(thisIvar)]; //获取成员变量的数据类型
NSLog(@"成员变量的数据类型 === :%@", key);
}
free(vars);
通过RunTime对一个类的成员函数进行遍历
unsigned int numMeths; //成员函数的个数
Method *meth = class_copyMethodList(NSClassFromString(@"UIView"), &numIvars);
for(int i = 0; i < numMeths; i++) {
Method thisMeth = meth[i];
SEL sel = method_getName(thisMeth);
const char *name = sel_getName(sel);
NSLog(@"成员函数===== :%s", name);
}
free(meth);
应用理念就是通过RunTime获取我们想要的一个类的成员变量的名称。然后我们可以通过KVC的方式获得其对象,进而进行操作。
下面有一个应用的小例子
通过RunTime获取成员变量的名称
unsigned int numIvars; //成员变量个数
Ivar *vars = class_copyIvarList(NSClassFromString(@"UISearchBar"), &numIvars);
NSString *key=[NSString new];
for(int i = 0; i < numIvars; i++) {
Ivar thisIvar = vars[i];
key = [NSString stringWithUTF8String:ivar_getName(thisIvar)]; //获取成员变量的名字
NSLog(@"成员变量的名字 ==== :%@", key);
key = [NSString stringWithUTF8String:ivar_getTypeEncoding(thisIvar)]; //获取成员变量的数据类型
NSLog(@"成员变量的数据类型 === :%@", key);
}
free(vars);
然后通过KVC获取对象
self.searchBar = [[UISearchBar alloc]initWithFrame:CGRectMake(12, 12,kWindowW-12*2-60, 32)];
_searchBar.layer.cornerRadius = 16;
_searchBar.layer.masksToBounds = YES;
_searchBar.delegate = self;
_searchBar.keyboardType = UIKeyboardAppearanceDefault;
_searchBar.placeholder = @"输入手机号码或名字";
_searchBar.barStyle = UIBarStyleDefault;
_searchBar.barTintColor = [UIColor greenColor];
[searchHeaderView addSubview:_searchBar];
//去掉搜索图标
UITextField *searchField = [_searchBar valueForKey:@"_searchField"];//_searchField就是通过RunTime找到的成员变量的名称。
searchField.leftView = nil;
searchField.clipsToBounds = YES;
// 同理可以更改placeholder的颜色
// [searchField setValue:[UIColor purpleColor] forKeyPath:@"_placeholderLabel.textColor"];