#import <Foundation/Foundation.h>
@interface SWStudent : NSObject
@property (nonatomic,copy) NSString *title;
@property (nonatomic,copy) NSString *desc;
@property (nonatomic,strong) NSArray *students;
@end
#import <UIKit/UIKit.h>
@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@end
//
// ViewController.m
// UITableView 資料分離
//
// Created by mac mini on 15-3-12.
// Copyright (c) 2015 年 SW. All rights reserved.
//
#import "ViewController.h"
#import "SWStudent.h" // 第二步 : 添加剛才建立的類
@interface ViewController () < UITableViewDataSource >
@property ( nonatomic , strong ) NSArray *dataList;
@end
@implementation ViewController
- ( NSArray *)dataList{
if ( _dataList == nil ) {
SWStudent *stu1 = [[ SWStudent alloc ] init ];
stu1. title = @"2013.3.12" ;
stu1. desc = @" 從新開始學習 , 第一遍 " ;
// 生成編号數組
NSMutableArray *arrayM1 = [ NSMutableArray array ];
for ( int i = 0 ; i < 10 ; i++) {
[arrayM1 addObject :[ NSString stringWithFormat : @"%@ - %04d" ,stu1. title ,i]];
}
stu1. students = arrayM1 ;
SWStudent *stu2 = [[ SWStudent alloc ] init ];
stu2. title = @"2013.3.12.20.59" ;
stu2. desc = @" 網開科技 " ;
// 生成編号數組
NSMutableArray *arrayM2 = [ NSMutableArray array ];
for ( int i = 0 ; i < 5 ; i++) {
[arrayM2 addObject :[ NSString stringWithFormat : @"%@ - %03d" ,stu2. title ,i]];
}
stu2.students = arrayM2;
SWStudent *stu3 = [[ SWStudent alloc ] init ];
stu3. title = @" 我是三組頭 " ;
stu3. desc = @" 我是三組尾 " ;
// 建立一個生成編号的數組
NSMutableArray *arrayM3 = [ NSMutableArray array ];
for ( int i = 0 ; i < 9 ; i++) {
// 把生成的字元串放到 arrayM3 中(太聰明了)
[arrayM3 addObject :[ NSString stringWithFormat : @"%@ - %02d" ,stu3. title ,i]];
}
stu3. students = arrayM3;
SWStudent *stu4 = [[ SWStudent alloc ] init ];
stu4. title = @" 第四組頭 " ;
stu4. desc = @" 第四組尾 " ;
NSMutableArray *arrayM4 = [ NSMutableArray array ];
for ( int i = 0 ; i < 2 ; i++) {
[arrayM4 addObject :[ NSString stringWithFormat : @"%@ - %01d" ,stu4. title ,i]];
}
stu4. students = arrayM4;
_dataList = @[ stu2,stu1,stu3,stu4 ] ;
}
return _dataList ;
}
#pragma mark - UITableView 的資料源方法 <UITableViewDataSource>
// 如果沒有實作,預設是 1
- ( NSInteger )numberOfSectionsInTableView:( UITableView *)tableView{
// 傳回數組的資料
return self . dataList . count ;
}
// 每個分組中得資料總數
// sction: 分組的編号
- ( NSInteger )tableView:( UITableView *)tableView numberOfRowsInSection:( NSInteger )section
{
// 取出 - 資料清單 - 中得分組的編号 - 自己的了解
// 取出數組中對應的學員資訊 - 教師的注釋
// 為什麼用 SWStudent 這個自己建立的類來建立一個新的對象,并給這個對象指派的是這個類中的資料清單的分組編号 ?
// 這是因為:在下邊傳回每一行有多少行數的時候,需要調用的是 “ 學員編号數組 ” 的數組,而 “ 學員編号數組 ” 是在 SWStudent 這個自己建立的類裡面建立的。
SWStudent *stu = self . dataList [section];
// 傳回 - 對象 stu - 裡面 - 學員編号數組 - 的個數 ( 就是你在前邊用 SWStudent 這個類中的 student 數組建立了幾個數組,把這幾個數組中有幾行顯示出來 )
return stu. students . count ;
}
// 告訴表格控件,每一行 cell 單元格的細節
// indexPath
// @property(nonatomic,readonly) NSInteger section; 分組
// @property(nonatomic,readonly) NSInteger row; 行
- ( UITableViewCell *)tableView:( UITableView *)tableView cellForRowAtIndexPath:( NSIndexPath *)indexPath{
// 執行個體化 TableViewCell 時,使用 initWithStyle 方法來進行執行個體化
UITableViewCell *tableViewCell = [[ UITableViewCell alloc ] initWithStyle : UITableViewCellStyleDefault reuseIdentifier : nil ];
// 取出 indexPath 對應的資料
// indexPath 總共有 2 個屬性,一個是 section( 分組 ) ,一個是 row( 行數 )
// 提取出來 student 對象的 “ 學員編号數組 ” 的分組資訊
// SWStudent *perpor - 中的 perpor 對象名稱要是改寫成其他的名稱,那麼後面的 perpor.students[indexPath.section] 和 perpor.students[indexPath.row] 的 perpor 對象名稱也要進行改變
SWStudent *perpor = perpor. students [indexPath. section ];
// 每一個 cell 中得 text 都是由 以 SWStudent 為基礎建立的對象 perpor 中得每一行來顯示
tableViewCell. textLabel . text = perpor. students [indexPath. row ];
return tableViewCell;
}
- ( NSString *)tableView:( UITableView *)tableView titleForFooterInSection:( NSInteger )section{
// SWStudent *footerTitle = self.dataList[section];
//
// return footerTitle.desc;
// 直接總數組中取出的對象是 id 類型,因為沒有明确的類型,是以不能使用點文法 (. 文法 ) ,隻能使用 getter 方法
// 這裡為什麼不能用 student 數組 ? 是因為用 self 調用的 ?
return [ self . dataList [section] desc ];
}
- ( NSString *)tableView:( UITableView *)tableView titleForHeaderInSection:( NSInteger )section{
// SWStudent *headerTitle = self.dataList[section];
// return headerTitle.title;
return [ self . dataList [section] title ];
} @end