データを管理するクラスを作ってみる。
基本かもしれないですが、UITableViewController内で使うデータアクセスのコードは、
データ管理クラスを間に挟むと、データ詳細を意識しなくて良いので使いやすくなります。
例えば、画面にこんな感じに魚データを表示する場合。
DataManagerというクラスを作って、そいつにデータを持たせます。
データのRead等はManagerにやらせます。
というわけで以下のような感じでコードを書いてみます。
"魚"を表すFishクラス
"データを管理する"DataManagerクラス
データ管理クラスを使いデータを表示するテーブルビューコントローラサブクラス
DataManager.h
#import <Foundation/Foundation.h> #import "Fish.h" @interface DataManager : NSObject // 他のクラスからアクセスできるように魚群を公開 @property(nonatomic,strong) NSArray *fishes; @end
DataManager.m
#import "DataManager.h" #import "Fish.h" // データを管理するクラス @implementation DataManager // 初期化します、シングルトンにしたければしてください。 - (id)init { self = [super init]; if (self) { [self readData]; } return self; } // データ読みこんで保持します - (void)readData{ NSArray *fishArray = @[@"さけ",@"さば",@"さめ",@"あざらし"]; self.fishes = fishArray; } @end
Fish.h
#import <Foundation/Foundation.h> // 魚くんクラス @interface Fish : NSObject @property(nonatomic,copy) NSString *name; @property(nonatomic) NSInteger width; @end
#import "Fish.h" @implementation Fish - (id)init { self = [super init]; if (self) { // デフォ値をいれたり、いれなかったりします _name = @"名無しのさかなさん"; _width = 0; } return self; } @end
データ管理クラスを使うテーブルビューコントローラのサブクラス
MyTVC.m
#import "MyTVC.h" #import "DataManager.h" @interface MyTVC () @end @implementation MyTVC { DataManager *_dtManager; } - (void)viewDidLoad { [super viewDidLoad]; // データマネージャーの準備、今回はここ、本来必要な所で初期化する _dtManager = [[DataManager alloc] init]; } // 行の数 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { // 行の数 return _dtManager.fishes.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; // Configure the cell... cell.textLabel.text = [_dtManager.fishes objectAtIndex:indexPath.row]; return cell; }