數據的讀取
當有一大堆數據需要使用時,直接將數據直接寫在代碼里面,不是一種合理的做法。如果數據經常改,就要經常翻開對應的代碼進行修改,造成代碼擴展性低
-
例如:
//通過懶加載 - (NSArray *)imageArray { //通過字典模型加載數據 if (_imageArray == nil) { self.imageArray = @[@{@"icon":@"singleBag",@"name":@"單肩包"}, @{@"icon":@"chainBag",@"name":@"鏈條包"}, @{@"icon":@"wallet",@"name":@"錢包"}, @{@"icon":@"handBag",@"name":@"手提包"}, @{@"icon":@"backpack",@"name":@"雙肩包"}, @{@"icon":@"xiekuabao",@"name":@"斜挎包"} .......一大堆數據..........]; } return _imageArray; }
因此,可以考慮將經常變的數據放在文件中進行存儲,程序啟動后從文件中讀取最新的數據。如果要變動數據,直接修改數據文件即可,不用修改代碼
-
那么什么是plist文件?
- 一般可以使用屬性列表文件存儲NSArray或者NSDictionary之類的數據,這種“屬性列表文件”的擴展名是plist,因此也稱為“plist文件”
-
例如plist文件
plist.png -
怎么添加plist文件
添加plist文件.png
-
怎么加載plist文件
- 接下來通過代碼來解析Plist文件中的數據
- 獲得Plist文件的全路徑
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
```- 加載plist文件
_shops = [NSArray arrayWithContentsOfFile:path];
```
- Plist文件的解析過程

## 懶加載
- 接下來通過代碼來解析Plist文件中的數據
- 獲得Plist文件的全路徑
```obj
NSBundle *bundle = [NSBundle mainBundle];
NSString *path = [bundle pathForResource:@"shops" ofType:@"plist"];
```
- 加載plist文件
```obj
_shops = [NSArray arrayWithContentsOfFile:path];
```
## 字典轉模型
- 什么是模型?
- 所謂模型,其實就是數據模型,專門用來存放數據的對象,用它來表示數據會更加專業
- 用模型取代字典的好處
- 使用字典的壞處
- 一般情況下,設置數據和取出數據都使用“字符串類型的key”,編寫這些key時,編輯器沒有智能提示,需要手敲
```obj
dict[@"name"] = @"Jack";
NSString *name = dict[@"name"];
```
- 手敲字符串key,key容易寫錯,Key如果寫錯了,編譯器不會有任何警告和報錯,造成設錯數據或者取錯數據
- 使用模型的好處
- 模型設置數據和取出數據都是通過它的屬性,屬性名如果寫錯了,編譯器會馬上報錯,因此,保證了數據的正確性
- 使用模型訪問屬性時,編譯器會提供一系列的提示,提高編碼效率
```obj
app.name = @"Jack";
NSString *name = app.name;
```
- 字典轉模型的過程最好封裝在模型內部
- 模型應該提供一個可以傳入字典參數的構造方法
```obj
- (instancetype)initWithDict:(NSDictionary *)dict;
+ (instancetype)xxxWithDict:(NSDictionary *)dict;
```
## 注意
- instancetype在類型表示上,跟id一樣,可以表示任何對象類型
- instancetype只能用在返回值類型上,不能像id一樣用在參數類型上
- instancetype比id多一個好處:編譯器會檢測instancetype的真實類型
## 類前綴
使用Objective-C開發iOS程序時,最好在每個類名前面加一個前綴,用來標識這個類的“老家”在哪,目的是防止N個人開發了一樣的類,沖突了,比如Jake、Will、Kate、Room在同一個項目中都各自開發了個Button類,這樣的程序是不能運行起來的,解決方案:Jake Will的類名叫做JWButton,Kate Room的類名叫做KRButton
## 自定義View
- view的封裝
- 如果一個view內部的子控件比較多,一般會考慮自定義一個view,把它內部子控件的創建屏蔽起來,不讓外界關心
- 外界可以傳入對應的模型數據給view,view拿到模型數據后給內部的子控件設置對應的數據
- 封裝控件的基本步驟
- 在initWithFrame:方法中添加子控件,提供便利構造方法
- 在layoutSubviews方法中設置子控件的frame(一定要調用super的layoutSubviews)
- 增加模型屬性,在模型屬性set方法中設置數據到子控件上
## 簡單的MVC
