2011年10月30日

modal画面のdelegateを親画面にしてみた

Java人によるObjective-C挑戦

前回の修正で成績一覧が出る様になったんですけど
「別画面で間違えた問題が後で見れるとだけじゃねぇ〜。
 もう一回間違えた問題をできるようにせんと学習にならん」との話。

それじゃ、100点じゃなかった時は
復習モードにするかという話になりまして
今日は以下の機能を付けます。

モーダルで呼び出した小画面が閉じるイベントを
親画面で行う(その中に復習モードの開始処理もつける)
→小画面の処理を親画面が代わりにする
→代わりに処理をしてもらう→委譲【イジョウ】
→delegate かなぁ

ということで小画面のdelegateを親画面に設定します。
まずは小画面側にdeletgateされる為の仕込みつけます。

↓が小画面のヘッダです。

// SeisekiListViewController.h

#import
#import "SeisekiData.h"

// ★ 委譲先(delegate)がこのオブジェクトから処理を丸投げされるときに
//   使用するメッセージの形式準備(javaでいうインターフェース)
@protocol SeisekiListViewDelegate
- (void) closeChildWindow:(int)score;
@end

@interface SeisekiListViewController : UIViewController {

id delegate; // ★ 委託先のオブジェクト登録先

IBOutlet UITableView *_seisekiListView;
IBOutlet UILabel *_seisekiScoreLabel;

IBOutlet UIBarButtonItem *_restartBtn;

SeisekiData *_seisekiData;
}

@property (nonatomic,retain) id delegate; // ★ 親画面が自身を登録できるようにセッタの準備

- (IBAction)closeDidPush:(id)sender;
-(void)setArrayData:(SeisekiData *)seikekiData;
-(void)setView;

@end


そして小画面で閉じるボタンの動作関数をインターフェースビルダーで紐付けて
modal_to_delegate_parent.jpg


実装は以下のように書きます。


// SeisekiListViewController.m

#import "SeisekiListViewController.h"

@implementation SeisekiListViewController

@synthesize delegate;

・・・ 省略 ・・・ 

// 閉じるボタン押下処理
- (IBAction)closeDidPush:(id)sender
{
int score = [_seisekiData getScorePoint];
[delegate closeChildWindow:score]; // ★委譲先(delegate)にメッセージ送るよ
}

@end



親画面で受け取る準備をします。
ヘッダにこのdelegateのプロトコルを使うという宣言をします。
※この例だとSeisekiListViewDelegateがプロトコルです。

// MainViewController.h

#import
#import "SeisekiListViewController.h"
#import "MsgView.h"
#import

@interface MainViewController : UIViewController {

・・・ 省略 ・・・ 




// MainViewController.m

#import "MainViewController.h"

@implementation MainViewController

・・・ 省略 ・・・ 

// 成績一覧の表示
- (IBAction)seisekiInfoBtnDidPush:(id)sender
{
SeisekiListViewController *seisekiListViewCtl = [[SeisekiListViewController alloc]
initWithNibName:@"SeisekiListViewController"
bundle:[NSBundle mainBundle]];

seisekiListViewCtl.delegate = self; // ★ ここで親画面を小画面のdelegateとして登録
[self presentModalViewController:seisekiListViewCtl animated:YES]; // 小画面Modalで表示

 ・・・ 省略 ・・・ 

}

// 以下成績一覧の非表示処理が小画面からメッセージ起動される
- (void) closeChildWindow:(int)score
{
[self dismissModalViewControllerAnimated:YES];

・・・ 省略 ・・・ 




↓現在の実行結果。↓



次は100点とった時に
子供が喜ぶようなアニメーションをつけてみようと思います。

Java人によるObjective-C挑戦
posted by itokami1123 at 03:24| Comment(0) | 日記
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: