分析
各看官請(qǐng)看 項(xiàng)目中有如下頁(yè)面需要實(shí)現(xiàn)
優(yōu)雅的實(shí)現(xiàn)方式
當(dāng)然,最優(yōu)雅的方式當(dāng)屬用UITableView+Model實(shí)現(xiàn)了,其中,“提供服務(wù)人員信息”、“訂單服務(wù)信息”、“訂單基本信息”為headerView,其他的每一行“XXX:xxxxx”都是一個(gè)由model(Model)控制的cell,每個(gè)model中包含title和detail字段,配置好數(shù)據(jù)源、代理(Controller),具體的布局、樣式邏輯就交給Cell(View)來(lái)控制就OK了。
使用這種思想的方法,有一篇文章寫的很好,推薦一下寫一個(gè)iOS復(fù)雜表單的正確姿勢(shì)
逗逼版實(shí)現(xiàn)方式
從圖中可見,UILabel的數(shù)量極多,而其中又有三種字體,分別為一級(jí)標(biāo)題,二級(jí)標(biāo)題和內(nèi)容,其中有字號(hào)和字體粗細(xì)之分。
如果剛好碰巧,之前實(shí)現(xiàn)這個(gè)頁(yè)面的程序員非常耐dou心bi,所有l(wèi)abel都手動(dòng)添加進(jìn)去,這時(shí)候需求來(lái)了,要改Appearence。
如果手動(dòng)設(shè)置字體,不僅重復(fù)代碼多,而且不方便,more,需要改變字號(hào)、增加UILabel等的話,將會(huì)十分麻煩。于是這時(shí)候可以利用OC之Runtime之便利,實(shí)現(xiàn)功能代碼以滿足項(xiàng)目需求。
逗逼版補(bǔ)救步驟
主要思路
- 利用
Runtime,取得當(dāng)前類的屬性列表 - 通過(guò)便利屬性列表,獲得title或detail的label屬性名
- 利用
KVC,通過(guò)屬性名取得當(dāng)前對(duì)象中的UILabel實(shí)例 - 各種
setFont、setColor......
實(shí)現(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é)
然而,本文這種方式來(lái)使用Runtime是一種非主流的方式,只在特定業(yè)務(wù)或者編程需求下使用,正確的Runtime應(yīng)用,是在用于那些字典模型互相轉(zhuǎn)、實(shí)現(xiàn)多繼承、添加屬性關(guān)聯(lián)對(duì)象等功能上,關(guān)于Runtime更多詳情可以看我的另一篇文章 Runtime學(xué)習(xí)筆記