データを管理するクラスを作ってみる。

基本かもしれないですが、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;
}