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文件的全路徑
- 加載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ù)都使用“字符串類型的key”交惯,編寫這些key時(shí)次泽,編輯器沒有智能提示,需要手敲
- 使用模型的好處
- 所謂模型只锻,其實(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;
}