のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

iPhone Push down refresh、Refresh Controller くるくるまわってロード

Sponsored Links

皆さんこんにちわ
お元気ですか?私はスリープが嫌いになりました。睡眠じゃないです。PCです。
ええ、nohupが仕事をしなかったのですよ。大量の時間を無駄にしました。
今も動いてたらうれしいなぁ…多分日曜日に終わるか終わらないかだから、勝手に仕事してくれないと困るんです。

さて、本日はリフレッシュ機能について
あの、twitterとかで上にくいってするとくるくるまわって更新するあやつのことです。
Push down refresh とか Refresh Controllerっていうんですね。

今日はそれを実装してみましょう。

StoryBoard

プロジェクトの生成〜Navigation Controllerの配置

まずは、プロジェクトを作ります。
次に最初にあるViewを削除し、TableViewを配置する。
TableViewを選択し、Editor→Embed in →Navigation Controllerを選択。

Prototype Cells

Table View cell の identifierをCellに変更

TableView

新しくファイルを作りクラスはUITableViewを選択
Custom ClassでClassで先ほど作ったファイルのクラス名を選択

Refresh

最後にTable View ControllerのRefreshingをEnabledに変更

そこまで終わると以下のようなイメージになります。

f:id:tereka:20140227210752p:plain

ソースコードを書いていきましょう

ソースコード

RefreshViewController.h

#import <UIKit/UIKit.h>

@interface RefreshViewController : UITableViewController{
    NSArray* StringArray;
}

@end

RefreshViewController.m

#import "RefreshViewController.h"

@interface RefreshViewController ()

@end

@implementation RefreshViewController

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    StringArray = [[NSArray alloc] initWithObjects:@"東京",@"大阪", nil];
    [self.refreshControl addTarget:self action:@selector(updateRecords) forControlEvents:UIControlEventValueChanged];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return StringArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    
   if (!cell) {
       cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
   }
    cell.textLabel.text = [StringArray objectAtIndex:indexPath.row];
    return cell;
}

-(void)updateRecords{
    StringArray = [[NSArray alloc] initWithObjects:@"関東",@"関西", nil];
    [self.tableView reloadData];
    [self.refreshControl endRefreshing];
}

@end

解説

RefreshController.h

NSArrayを宣言しているだけです

RefreshController.m

ViewDidLoad

StringArrayはテーブルの要素を入れているのみです。

refreshcontrolの部分が新しいですね。
refreshcontrolで、イベントを動作をリンクさせています。
今回のメンバ関数の内容を動作として記載すると、

UIControlEventValueChangedは値が変化したときなので、refreshControlの値が変更されたときにupdateRecordsを呼び出す

ような動作を行っていると思います。厳密には違いそうですが、、、。

イベントコントロールについてはこちらに記載されていました。
http://iphone-tora.sakura.ne.jp/uicontrol.html

numberOfSectionsInTableView,numberOfRowsINSection,cellForRowAtIndexPath

相変わらずの処理ですね。セルに内容を入れてテーブルを作っています。

updateRecords

self.tableView reloadData = 新しくテーブルを作っているだけです。
self.refreshControl endRefreshing =ここで更新作業は終わりですよ。(くるくるもここで終了)

動作

こんな表示から
f:id:tereka:20140228011239p:plain

くるくるまわって

f:id:tereka:20140228011333p:plain

できあがり、文字変わりましたよね!

f:id:tereka:20140228011347p:plain