iphone開發之表格元件UITableView的使用(三)通過載入plist檔案字典轉模型方式展示分組資料
阿新 • • 發佈:2019-01-24
1、通過載入plist檔案,利用在懶載入中把字典轉模型實現的步驟如下:
(1)新建plist檔案,編輯plist檔案內容新增屬性。編輯步驟如下:
在檔案中新建一個NSArray用來包含所有的資料,點選大的NSArray資料的三角符號向下,新建元素字典作為NSArray的每一項內容,為第一個陣列元素即字典新增屬性(包括組標題,組尾描述,小的NSArray:用來描述當前組的每一行內容)。然後選中第一個字典(陣列的第一項)複製貼上…為整體的NSArray陣列新增專案。
(2)新建model物件。除了新增和字典對應的屬性外還要新增兩個返回值型別為instancetype的初始化類方法和物件方法。
(3)編輯model物件的初始化方法
注意:在初始化方法中可以把引數字典物件的每一個屬性逐個賦值給model物件的對應屬性,但是當物件的屬性很多即字典的鍵值對很多時就會變得非常麻煩。
解決方法:在初始化方法中利用物件的如下方法:
[self setValueForKeysWithDictionary:dict]; 就會把字典中每一個鍵對應的值一一賦值給model物件中和字典鍵名相同的屬性變數。
具體程式碼示例如下:
-(instancetype)initWithDict: (NSDictionary *)dict
{
if(self = [super init])
{
//self.title = dict[@“title”];
// self.desc = dict[@“desc”];
// self.cars =dict[@“cars”];
[self setValuesForKeyWithDictionary: dict]; // KVC 中的方法
}
return self;
}
-(instancetype)groupWithDict: (NSDictionary *)dict
{
return [[self alloc] initWithDict: dict];
}
(4)在控制器的.h檔案中新增一個數組屬性
@property(nonatomic,strong)NSArray *groups;
(5)重寫陣列屬性的get方法,並在方法內實現懶載入。具體步驟如下:
1>找到plist檔案的路徑,(用[[NSBundle mainBundle] pathForResource:…] 方法實現)。
2>載入plist檔案。利用陣列的arrayWithContentOfFile方法。
3>把字典轉成模型。新建一個空的可變陣列。用來存放model物件。
4> 遍歷字典陣列中的每一個字典,把字典轉換成模型,把模型放到存放model物件的陣列中。
5>把存放model的可變陣列賦值給陣列屬性變數。
6>返回下劃線陣列變數屬性。
(切記:不可在重寫get方法中返回self.陣列屬性,否則自己呼叫自己造成死迴圈)。 具體程式碼如下:
-(NSArray *)groups
{
if(_group == nil){
// 懶載入資料
//找到plist檔案的路徑
NSString *path = [[NSBundle mainBundle] pathFOrResource:@“XXX.plist”ofType:nil];
// 載入plist檔案
NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];
//把字典轉為模型
NSMutableArray *arrayModel = [NSMutableArray array];
// 遍歷字典陣列中的每一個字典,把每個字典轉成模型,並把模型放到arrayModel陣列中
for(NSDictionary * dict in arrayDict)
{
// 建立模型物件
CZGroup *model = [CZGroup groupWithDict: dict];
[arrayModel addObject: model];
}
_groups = arrayModel;
}
return _groups;
}
(6)拖拽或新建一個UITableView屬性變數,並在viewDidLoad方法中對其屬性進行設定。讓當前控制器遵守UITableViewDataSource協議,即讓當前控制器作為UITableView元件的資料來源物件。
(7)設定UITableView元件的dataSource屬性為當前控制器,即
self.tableView.dataSource = self; 或者拖線實現。
(8)新增並實現資料來源協議中的幾個方法。如下所示:
-(NSTnteger)numberOfSectionsInTableView:(UITableView *) tableView
{ // 此方法用於告訴UITableView元件分為幾個組
return self.groups.count; // 陣列元素的個數即是組數
}
-(NSInteger) tableVIew: (UITableVIew *)tableView numberOfRowsInSection:(NSInteger) section;
{ // 此方法用於用於返回每一組的行數
// 根據組索引(section)獲取組物件
CGGroup *group = self.groups[section];
return group.cars.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ // 此方法用於返回每一組每一行的內容(單元格UITableViewCell) 具體步驟如下:
// 1、獲取模型資料
//獲取組模型
CZGroup *group = self.groups[indexPath.section];
//獲取對應的汽車品牌
NSString *brand = group.cars[indexPath.row];
// 2、建立單元格UITableViewCell
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIndentifier:nil];
// 3、把模型中的資料設定給單元格中的子控制元件
//把汽車品牌設定給單元格中的Label
cell.textLabel.text = brand;
// 4、返回單元格UITableViewCell
return cell;
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section;
{ // 此方法用於給每一組新增組標題
CZGroup *group = self.groups[section];
return group.title;
}
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
{ // 返回組尾描述
CZGroup *group = self.groups[section];
return group.desc;
}
(9)非常重要的一條:在建立UITableView時千萬不能忘記設定風格。因為預設下是plain不分組的。要進行屬性設定為group。如下所示:
(1)新建plist檔案,編輯plist檔案內容新增屬性。編輯步驟如下:
在檔案中新建一個NSArray用來包含所有的資料,點選大的NSArray資料的三角符號向下,新建元素字典作為NSArray的每一項內容,為第一個陣列元素即字典新增屬性(包括組標題,組尾描述,小的NSArray:用來描述當前組的每一行內容)。然後選中第一個字典(陣列的第一項)複製貼上…為整體的NSArray陣列新增專案。
(2)新建model物件。除了新增和字典對應的屬性外還要新增兩個返回值型別為instancetype的初始化類方法和物件方法。
(3)編輯model物件的初始化方法
注意:在初始化方法中可以把引數字典物件的每一個屬性逐個賦值給model物件的對應屬性,但是當物件的屬性很多即字典的鍵值對很多時就會變得非常麻煩。
解決方法:在初始化方法中利用物件的如下方法:
[self setValueForKeysWithDictionary:dict]; 就會把字典中每一個鍵對應的值一一賦值給model物件中和字典鍵名相同的屬性變數。
具體程式碼示例如下:
-(instancetype)initWithDict: (NSDictionary *)dict
{
if(self = [super init])
{
//self.title = dict[@“title”];
// self.desc = dict[@“desc”];
// self.cars =dict[@“cars”];
[self setValuesForKeyWithDictionary: dict]; // KVC 中的方法
}
return self;
}
-(instancetype)groupWithDict: (NSDictionary *)dict
{
return [[self alloc] initWithDict: dict];
}
(4)在控制器的.h檔案中新增一個數組屬性
@property(nonatomic,strong)NSArray *groups;
(5)重寫陣列屬性的get方法,並在方法內實現懶載入。具體步驟如下:
1>找到plist檔案的路徑,(用[[NSBundle mainBundle] pathForResource:…] 方法實現)。
2>載入plist檔案。利用陣列的arrayWithContentOfFile方法。
3>把字典轉成模型。新建一個空的可變陣列。用來存放model物件。
4> 遍歷字典陣列中的每一個字典,把字典轉換成模型,把模型放到存放model物件的陣列中。
5>把存放model的可變陣列賦值給陣列屬性變數。
6>返回下劃線陣列變數屬性。
(切記:不可在重寫get方法中返回self.陣列屬性,否則自己呼叫自己造成死迴圈)。 具體程式碼如下:
-(NSArray *)groups
{
if(_group == nil){
// 懶載入資料
//找到plist檔案的路徑
NSString *path = [[NSBundle mainBundle] pathFOrResource:@“XXX.plist”ofType:nil];
// 載入plist檔案
NSArray *arrayDict = [NSArray arrayWithContentsOfFile:path];
//把字典轉為模型
NSMutableArray *arrayModel = [NSMutableArray array];
// 遍歷字典陣列中的每一個字典,把每個字典轉成模型,並把模型放到arrayModel陣列中
for(NSDictionary * dict in arrayDict)
{
// 建立模型物件
CZGroup *model = [CZGroup groupWithDict: dict];
[arrayModel addObject: model];
}
_groups = arrayModel;
}
return _groups;
}
(6)拖拽或新建一個UITableView屬性變數,並在viewDidLoad方法中對其屬性進行設定。讓當前控制器遵守UITableViewDataSource協議,即讓當前控制器作為UITableView元件的資料來源物件。
(7)設定UITableView元件的dataSource屬性為當前控制器,即
self.tableView.dataSource = self; 或者拖線實現。
(8)新增並實現資料來源協議中的幾個方法。如下所示:
-(NSTnteger)numberOfSectionsInTableView:(UITableView *) tableView
{ // 此方法用於告訴UITableView元件分為幾個組
return self.groups.count; // 陣列元素的個數即是組數
}
-(NSInteger) tableVIew: (UITableVIew *)tableView numberOfRowsInSection:(NSInteger) section;
{ // 此方法用於用於返回每一組的行數
// 根據組索引(section)獲取組物件
CGGroup *group = self.groups[section];
return group.cars.count;
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ // 此方法用於返回每一組每一行的內容(單元格UITableViewCell) 具體步驟如下:
// 1、獲取模型資料
//獲取組模型
CZGroup *group = self.groups[indexPath.section];
//獲取對應的汽車品牌
NSString *brand = group.cars[indexPath.row];
// 2、建立單元格UITableViewCell
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIndentifier:nil];
// 3、把模型中的資料設定給單元格中的子控制元件
//把汽車品牌設定給單元格中的Label
cell.textLabel.text = brand;
// 4、返回單元格UITableViewCell
return cell;
}
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger) section;
{ // 此方法用於給每一組新增組標題
CZGroup *group = self.groups[section];
return group.title;
}
-(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section;
{ // 返回組尾描述
CZGroup *group = self.groups[section];
return group.desc;
}
(9)非常重要的一條:在建立UITableView時千萬不能忘記設定風格。因為預設下是plain不分組的。要進行屬性設定為group。如下所示: