前回の修正で成績一覧が出る様になったんですけど
「別画面で間違えた問題が後で見れるとだけじゃねぇ〜。
もう一回間違えた問題をできるようにせんと学習にならん」との話。
それじゃ、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
そして小画面で閉じるボタンの動作関数をインターフェースビルダーで紐付けて
実装は以下のように書きます。
// 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挑戦