美文网首页
利用运行时修改类属性(runtime)

利用运行时修改类属性(runtime)

作者: 怪兽密保 | 来源:发表于2016-11-16 11:33 被阅读0次

    有一些控件的属性值苹果官方并没有开放可以让我们去修改(苹果有这个属性值,只是我们没有办法直接访问并修改),而我们有有需求去修改其属性值,这时就可以利用运行时机制去访问并修改
    1.首先遍历想要修改的类的属性,使用运行时机制查看其内部的一些属性,看有没有我们需要的。

    1.遍历属性值
    <pre>
    + (void)getProperties
    {
    unsigned int count = 0;
    objc_property_t *properties = class_copyPropertyList([UITextField class], &count);
    for (int i = 0; i<count; i++) {
    // 取出属性
    objc_property_t property = properties[i];
    // 打印属性名字
    XMGLog(@"%s <----> %s", property_getName(property), property_getAttributes(property));
    }
    free(properties);
    }
    </pre>

    <pre>

    2.遍历成员变量

    • (void)getIvars
      {
      unsigned int count = 0;
      // 拷贝出所有的成员变量列表
      Ivar *ivars = class_copyIvarList([UITextField class], &count);
      for (int i = 0; i<count; i++) {
      // 取出成员变量
      // Ivar ivar = *(ivars + i);
      Ivar ivar = ivars[i];
      // 打印成员变量名字
      XMGLog(@"%s %s", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
      }
      // 释放
      free(ivars);
      }
      </pre>
    二.利用KVC去改变自己想要的值

    1.例如改变占位文字的值
    <pre>
    // 修改占位文字颜色
    [self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
    </pre>

    补充KVC(键值编码)的一些知识点

    可以通过seetter、getter 方法来设置和修改对象的属性值,也可以通过简化的点预防来设置、修改对象的属性值。实际上,Objective-C还支持一种更灵活的操作方式,就是以字符串形式简介操作对象的属性,这种方式全称是Key value Coding(KVC)即键值编码

    setValue: 属性值 forkey: 属性名 为指定属性设置值

    valueForKey:属性名 获取知道属性的值

    在KVC协议中操作Key路径的方法

    setValue:forkeyPath: 根据Key路径设置属性值

    valueForKeyPath: 根据Key路径获取属性值

    例如-
    <pre>
    [self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
    </pre>

    setValuesForKeysWithDictionary: 根据字典来为对应的属性值赋值
    注意:属性名必须和字典值一一对应否则会报错

    解决KVC报错

    KVC报错一般都是找不到对应的Key;这时就需要重写setValue:forUndefinedKey:方法
    <pre>

    // 系统调用这个方法,就会报错,可以把系统的方法覆盖,就能继续使用KVC,字典转模型了

    • (void)setValue:(id)value forUndefinedKey:(NSString *)key
      {
      //value:没有找到的key对应的值
      //key:没有找到的key
      //这里可以处理一下key,这样就可以重新和对应的属性值对应并赋值
      if([key isEqualtoString:@"id"])
      {
      _ID=value;
      }
      }
      </pre>

    相关文章

      网友评论

          本文标题:利用运行时修改类属性(runtime)

          本文链接:https://www.haomeiwen.com/subject/bnzlpttx.html