RunTime的简单应用

首先就是在.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的方式获得其对象,进而进行操作。


下面有一个应用的小例子

最初的图.png

通过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"];

最终的图.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 自己最近在研究Runtime,研究好久才知道了一些大概和简单的应用。在这里做一个笔记。RunTime被称为iOS开...
    Sunrain16阅读 693评论 0 2
  • 对于从事 iOS 开发人员来说,所有的人都会答出【runtime 是运行时】什么情况下用runtime?大部分人能...
    梦夜繁星阅读 3,741评论 7 64
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,651评论 33 466
  • 利用runtime,我们能够根据服务端所给的image来动态的变化TabBarItem的大小,类似像淘宝、京东活动...
    wsj2012阅读 492评论 1 0
  • 大家好,我是赛赛酱,目前就职于阿里巴巴菜鸟网络部门。 前几年互联网火的一塌糊涂,使得EEer们也都纷纷转行Code...
    奔跑的小菜鸟阅读 2,767评论 9 20