UI-plist饮笛、懶加載、封裝论熙、模型

1福青、加載plist文件


  • 文件名不為 info.plist
  • 接下來通過代碼來解析Plist文件中的數(shù)據(jù)
    • 獲得Plist文件的全路徑
      NSBundle *bundle = [NSBundle mainBundle];
      NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
      NSString *path = [bundle pathForResource:@"shops.plist" ofType:nil];// 如果屬性為空就展示文件名。這個(gè)寫法也可以
  • 加載plist文件
    _shops = [NSArray arrayWithContentsOfFile:path]
- (void)viewDidLoad {
    // 加載plist數(shù)據(jù)
    
    // 一個(gè)NSBundle對(duì)象對(duì)應(yīng)一個(gè)資源包(圖片脓诡、音頻无午、視頻、plis等文件)
    // NSBundle的作用:用來訪問與之對(duì)應(yīng)的資源包內(nèi)部的文件祝谚,可以用來獲得文件的全路徑
    // 項(xiàng)目中添加的資源都會(huì)被添加到主資源包中
    // [NSBundle mainBundle]關(guān)聯(lián)的就是項(xiàng)目的主資源包
    NSBundle *bundle = [NSBundle mainBundle];
    
    // 利用mainBundle獲得plist文件在主資源包中的全路徑
    NSString *file = [bundle pathForResource:@"shops" ofType:@"plist"];
//    NSString *file = [bundle pathForResource:@"shops.plist" ofType:nil];
    
    // 凡是參數(shù)名為File宪迟,傳遞的都是文件的全路徑
    self.shops = [NSArray arrayWithContentsOfFile:file];

}

模型取代字典

  • 使用字典的壞處
    • 一般情況下,設(shè)置數(shù)據(jù)和取出數(shù)據(jù)都使用“字符串類型的key”交惯,編寫這些key時(shí)次泽,編輯器沒有智能提示,需要手敲
      dict[@"name"] = @"Jack";
      NSString *name = dict[@"name"];
    • 手敲字符串key席爽,key容易寫錯(cuò)
    • Key如果寫錯(cuò)了意荤,編譯器不會(huì)有任何警告和報(bào)錯(cuò),造成設(shè)錯(cuò)數(shù)據(jù)或者取錯(cuò)數(shù)據(jù)
  • 使用模型的好處
    • 所謂模型只锻,其實(shí)就是數(shù)據(jù)模型玖像,專門用來存放數(shù)據(jù)的對(duì)象,用它來表示數(shù)據(jù)會(huì)更加專業(yè)
    • 模型設(shè)置數(shù)據(jù)和取出數(shù)據(jù)都是通過它的屬性炬藤,屬性名如果寫錯(cuò)了御铃,編譯器會(huì)馬上報(bào)錯(cuò),因此沈矿,保證了數(shù)據(jù)的正確性
    • 使用模型訪問屬性時(shí)上真,編譯器會(huì)提供一系列的提示,提高編碼效率
      app.name = @"Jack";
      NSString *name = app.name;

字典轉(zhuǎn)模型

  • 字典轉(zhuǎn)模型的過程最好封裝在模型內(nèi)部
  • 模型應(yīng)該提供一個(gè)可以傳入字典參數(shù)的構(gòu)造方法
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
- (instancetype)initWithDict:(NSDictionary *)dict
{
    if (self = [super init]) {
        self.name = dict[@"name"];
        self.icon = dict[@"icon"];
    }
    return self;
}

+ (instancetype)shopWithDict:(NSDictionary *)dict
{
    return [[self alloc] initWithDict:dict];
}
  • instancetype

  • instancetype在類型表示上羹膳,跟id一樣睡互,可以表示任何對(duì)象類型

  • instancetype只能用在返回值類型上,不能像id一樣用在參數(shù)類型上

  • instancetype比id多一個(gè)好處:編譯器會(huì)檢測(cè)instancetype的真實(shí)類型

  • 字典轉(zhuǎn)模型的過程


2陵像、懶加載


  • 數(shù)據(jù)較大的時(shí)候
  • 上面代碼寫在了viewDidLoad里面就珠,在方法中可以直接調(diào)用self.shps調(diào)用數(shù)據(jù),但如果數(shù)據(jù)較大的而且這個(gè)界面沒用到數(shù)據(jù)的時(shí)候醒颖,會(huì)出現(xiàn)浪費(fèi)內(nèi)存資源
  • 好處:調(diào)用數(shù)據(jù)的時(shí)候 才去 加載數(shù)據(jù)妻怎,而且只加載一次
  • 重寫-(void) {****}方法中'獲取數(shù)據(jù)'的 self.shops 的get方法→ [self shops]按?鍵查看shops 就回跳到-(NSArray)shops{}這個(gè)方法中
- (NSArray *)shops {
    if (_shops == nil) {
        _shops = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]];
    }
    return _shops;
}

這段代碼沒有寫在 viewDidLoad 中,所以不回加載泞歉。用到的時(shí)候在去加載逼侦。
if(_shops == nil){ }當(dāng)加載數(shù)據(jù)的時(shí)候判斷數(shù)據(jù)是否為空,為空就加載一次數(shù)據(jù)腰耙。然后返回return _shops榛丢。當(dāng)再次加載數(shù)據(jù)的時(shí)候判斷不為空(因?yàn)橐呀?jīng)內(nèi)存中已經(jīng)加載過一次數(shù)據(jù),是有數(shù)據(jù)狀態(tài))挺庞,不為空就跳過if(_shops == nil){ }這段代碼晰赞,直接return _shops

  • 懶加載數(shù)據(jù)模型
// 加載plist數(shù)據(jù)(比較大)
// 懶加載:用到時(shí)再去加載,而且也只加載一次
- (NSArray *)shops
{
    if (_shops == nil) {
        // 1选侨、加載一個(gè)字典數(shù)組
        NSArray *dictArray = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"]];
        //2掖鱼、字典數(shù)組轉(zhuǎn)模型數(shù)組
        NSMutableArray *shopArray = [NSMutableArray array];
        for (NSDictionary *dict in dictArray) {
            XMGShop *shop = [XMGShop shopWithDict:dict];
            [shopArray addObject:shop];
        }
        //3.賦值
        _shops = shopArray;
    }
    return _shops;
}

3、View的封裝


  • 如果一個(gè)view內(nèi)部的子控件比較多侵俗,一般會(huì)考慮自定義一個(gè)view锨用,把它內(nèi)部子控件的創(chuàng)建屏蔽起來,不讓外界關(guān)心
  • 外界可以傳入對(duì)應(yīng)的模型數(shù)據(jù)給view隘谣,view拿到模型數(shù)據(jù)后給內(nèi)部的子控件設(shè)置對(duì)應(yīng)的數(shù)據(jù)
  • 封裝控件的基本步驟
  • 在initWithFrame:方法中添加子控件增拥,提供便利構(gòu)造方法
  • 在layoutSubviews方法中設(shè)置子控件的frame(一定要調(diào)用super的layoutSubviews)
  • 增加模型屬性,在模型屬性set方法中設(shè)置數(shù)據(jù)到子控件上
  • 步驟
  • 新建UIView文件
  • 重寫構(gòu)造方法寻歧,添加子控件代碼代碼1
  • 設(shè)置子控件的frame 代碼2``-(void)layoutSubviews方法
  • 重寫模型的set方法的模型數(shù)據(jù)代碼3
  • 布置子控件-> 設(shè)置控件大小 -> 加載數(shù)據(jù)
// 代碼1  重寫UIView類的 init 的構(gòu)造方法
- (instancetype)init {
  if(self = [super init]){
   // 代碼 :要初始化創(chuàng)建的 界面
  }
  return self;
}

// 推薦使用
- (instancetype)initWithFrame:(CRrect)frame {
  if(self = [super initWithFrame:frame]){
   // 代碼 :要初始化創(chuàng)建的 界面
  }
  return self;
}
// 代碼2 布局子控件的位置  外面尺寸發(fā)生改變的時(shí)候就會(huì)調(diào)用
-(void)layoutSubviews {
  // 一定要寫
  [super layoutSubviews];
// 代碼
}
// 代碼3 模型數(shù)據(jù)
-(void)setShop:(SXShop *)shop {
  _shop = shop
  self.nameLabel.text = shop.name;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末掌栅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子码泛,更是在濱河造成了極大的恐慌猾封,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件噪珊,死亡現(xiàn)場(chǎng)離奇詭異晌缘,居然都是意外死亡齐莲,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門磷箕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來选酗,“玉大人,你說我怎么就攤上這事岳枷∶⑻睿” “怎么了?”我有些...
    開封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵空繁,是天一觀的道長(zhǎng)殿衰。 經(jīng)常有香客問我,道長(zhǎng)盛泡,這世上最難降的妖魔是什么闷祥? 我笑而不...
    開封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮傲诵,結(jié)果婚禮上蜀踏,老公的妹妹穿的比我還像新娘。我一直安慰自己掰吕,他們只是感情好果覆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著殖熟,像睡著了一般局待。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上菱属,一...
    開封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天钳榨,我揣著相機(jī)與錄音,去河邊找鬼纽门。 笑死薛耻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的赏陵。 我是一名探鬼主播饼齿,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蝙搔!你這毒婦竟也來了缕溉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤吃型,失蹤者是張志新(化名)和其女友劉穎证鸥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枉层,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年泉褐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸟蜡。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡兴枯,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出矩欠,到底是詐尸還是另有隱情,我是刑警寧澤悠夯,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布癌淮,位于F島的核電站,受9級(jí)特大地震影響沦补,放射性物質(zhì)發(fā)生泄漏乳蓄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一夕膀、第九天 我趴在偏房一處隱蔽的房頂上張望虚倒。 院中可真熱鬧,春花似錦产舞、人聲如沸魂奥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耻煤。三九已至,卻和暖如春准颓,著一層夾襖步出監(jiān)牢的瞬間哈蝇,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工攘已, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炮赦,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓样勃,卻偏偏與公主長(zhǎng)得像吠勘,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子峡眶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容