蘋果官方的類中只提供給我們一小部分成員變數和方法,但有時候我們需要的恰好就沒有提供,這樣就會令開發人員十分懊惱了,那怎樣才能獲取該類中所有的變數及方法,用來查詢是否有相對應的變數和方法呢?
我們可以使用蘋果自帶的 執行時(runtime) 來獲取
執行時(Runtime):
- 蘋果官方一套C語言庫
- 能做很多底層操作(比如訪問隱藏的一些成員變數成員方法….)
以下以 UITextField 為例
一. 包含執行時標頭檔案
#import <objc/runtime.h>
複製程式碼
二. 獲取所有的成員變數
unsigned int count = 0;
// 拷貝出所胡的成員變數列表
Ivar *ivars = class_copyIvarList([UITextField class], &count);
for (int i = 0; i<count; i++) {
// 取出成員變數
Ivar ivar = *(ivars + i);
// 列印成員變數名字
LXFLog(@"%s", ivar_getName(ivar));
// 列印成員變數的資料型別
LXFLog(@"%s", ivar_getTypeEncoding(ivar));
}
// 釋放
free(ivars);
複製程式碼
Swift的寫法如下
var count: UInt32 = 0
let ivars = class_copyIvarList(UIViewController.self, &count)!
for i in 0..<count {
let namePoint = ivar_getName(ivars[Int(i)])!
let name = String(cString: namePoint)
print(name)
}
複製程式碼
三. 獲取所有的成員方法
// 下面的UITextField改為你想獲取所有屬性的類名
// methCount: 這個類所有屬性的個數
unsigned int methCount = 0;
Method *meths = class_copyMethodList([UITextField class], &methCount);
for(int i = 0; i < methCount; i++) {
Method meth = meths[i];
SEL sel = method_getName(meth);
const char *name = sel_getName(sel);
NSLog(@"%s", name);
}
free(meths);
複製程式碼
最後,通過KVC的方式給相應的成員變數賦值即可!
如:
// 修改點位文字顏色
UILabel *placeholderLabel = [self valueForKeyPath:@"_placeholderLabel"];
placeholderLabel.textColor = [UIColor redColor];
// 或者這樣
[self setValue:[UIColor grayColor] forKeyPath:@"_placeholderLabel.textColor"];
複製程式碼