分析
各看官請看 項目中有如下頁面需要實現(xiàn)
優(yōu)雅的實現(xiàn)方式
當(dāng)然堂鲜,最優(yōu)雅的方式當(dāng)屬用UITableView
+Model
實現(xiàn)了羹应,其中丘逸,“提供服務(wù)人員信息”、“訂單服務(wù)信息”馏予、“訂單基本信息”為headerView
天梧,其他的每一行“XXX:xxxxx”都是一個由model(Model
)控制的cell
,每個model
中包含title和detail字段霞丧,配置好數(shù)據(jù)源呢岗、代理(Controller
),具體的布局蛹尝、樣式邏輯就交給Cell(View
)來控制就OK了后豫。
使用這種思想的方法,有一篇文章寫的很好突那,推薦一下寫一個iOS復(fù)雜表單的正確姿勢
逗逼版實現(xiàn)方式
從圖中可見挫酿,UILabel
的數(shù)量極多,而其中又有三種字體愕难,分別為一級標(biāo)題早龟,二級標(biāo)題和內(nèi)容,其中有字號和字體粗細(xì)之分猫缭。
如果剛好碰巧葱弟,之前實現(xiàn)這個頁面的程序員非常耐dou心bi,所有l(wèi)abel都手動添加進(jìn)去猜丹,這時候需求來了芝加,要改Appearence。
如果手動設(shè)置字體射窒,不僅重復(fù)代碼多藏杖,而且不方便将塑,more,需要改變字號制市、增加UILabel
等的話抬旺,將會十分麻煩。于是這時候可以利用OC之Runtime
之便利祥楣,實現(xiàn)功能代碼以滿足項目需求开财。
逗逼版補救步驟
主要思路
- 利用
Runtime
,取得當(dāng)前類的屬性列表 - 通過便利屬性列表误褪,獲得title或detail的label屬性名
- 利用
KVC
责鳍,通過屬性名取得當(dāng)前對象中的UILabel
實例 - 各種
setFont
、setColor
......
實現(xiàn)代碼
unsigned int count = 0;
// 獲得屬性列表
objc_property_t *propertyList = class_copyPropertyList([self class], &count);
for(int i=0; i<count; i++) {
//取得屬性名
objc_property_t property = propertyList[i];
const char* propertyName = property_getName(property);
//分情況進(jìn)行不同的操作兽间,此處分為detailLbl和titleLbl
if (strstr(propertyName, "Title")) {
UILabel *label = [self valueForKey:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
[label setFont:[UIFont systemFontOfSize:kZFFontSizeThirdlyTitle weight:UIFontWeightRegular]];
} else if (strstr(propertyName, "Detail")) {
UILabel *label = [self valueForKey:[NSString stringWithCString:propertyName encoding:NSUTF8StringEncoding]];
[label setFont:[UIFont systemFontOfSize:kZFFontSizeThirdlyTitle weight:UIFontWeightLight]];
}
}
// 釋放資源
free(propertyList);
總結(jié)
然而历葛,本文這種方式來使用Runtime
是一種非主流的方式,只在特定業(yè)務(wù)或者編程需求下使用嘀略,正確的Runtime
應(yīng)用恤溶,是在用于那些字典模型互相轉(zhuǎn)、實現(xiàn)多繼承帜羊、添加屬性關(guān)聯(lián)對象等功能上咒程,關(guān)于Runtime
更多詳情可以看我的另一篇文章 Runtime學(xué)習(xí)筆記