1. 程式人生 > >iphone開發之表格元件UITableView的使用(三)通過載入plist檔案字典轉模型方式展示分組資料

iphone開發之表格元件UITableView的使用(三)通過載入plist檔案字典轉模型方式展示分組資料

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。如下所示: