用Runtime減少代碼量(objc/runtime.h的學(xué)習(xí))

分析

各看官請(qǐng)看 項(xiàng)目中有如下頁(yè)面需要實(shí)現(xiàn)


應(yīng)用截圖

優(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í)筆記

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,020評(píng)論 4 61
  • 細(xì)數(shù)下來(lái)到過(guò)的地方不多,也不少,不過(guò)總覺得還是跟從沒到過(guò)任何地方一樣,對(duì)于城市的認(rèn)識(shí)都只是停留在淺淺,淺淺的層面上...
    江潯閱讀 331評(píng)論 0 0

友情鏈接更多精彩內(nèi)容