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) | 日記

2011年10月22日

親画面からModal画面として別UIViewを表示してみた

Java人によるObjective-C挑戦

間違えた問題が後でみれる様にしたいって話になって
今までの算数の結果を別画面に一覧で表示しようと思います。

まずは、一覧画面のUIViewControllerを作成します。
modal000.jpg

そしてInterface Builderで画面のデザインを作成します。
modal001.jpg


親画面にmodal画面起動用のボタンを作り押下イベントを関数と紐づけます。
modal002.jpg

そして実装。

// 成績一覧の表示
- (IBAction)seisekiInfoBtnDidPush:(id)sender
{
// ↓これがさっき作ったUIViewController
SeisekiListViewController *dialog = [[SeisekiListViewController alloc]
initWithNibName:@"SeisekiListViewController"
bundle:[NSBundle mainBundle]];

[self presentModalViewController:dialog animated:YES]; // Modalで表示するよ

// ↓ こんな感じで親画面から引数も渡せます。
[dialog setArrayData:_seikekiData];
[dialog setView];

}


親画面から引数で値もこの際に渡せます。
(もちろん引数渡す関数は事前に用意してね。)

そうすると以下みたいに動きます。



Java人によるObjective-C挑戦
posted by itokami1123 at 22:33| Comment(0) | 日記

2011年10月15日

UISegmentedControlを使ってみた

Java人によるObjective-C挑戦

引き算もできるよと子供が言うので
足し算と引き算を切り替えを”UISegmentedControl”で作ってみました。

まずはぺたっと貼付けて色等を変えます。
UISeg001.jpg

続いてセグメントを切り替えたイベントを登録します。
UISeg002.jpg


selectedSegmentIndexで今選択している場所がintで取得できます。

// 計算方法の変更があった場合
- (IBAction)computeChnaged:(id)sender {
UISegmentedControl *segCtl = sender;
_computeIdx = [segCtl selectedSegmentIndex];
}



あと、計算中の途中で式の変更をして欲しくなかったので
計算が始まったら非表示にしました。

まず、objective-c上で扱える様にIBOutletをセット
UISeg003.jpg

↓のようにsetHiddenにYESを入れると非表示になります。(NOで表示になります)
[_computeChangeSwitch setHidden:YES ]; // 計算式の変更 非表示

無限に計算するのはやだ、計算の成績が知りたいなど要望をうけたので
次は、成績結果画面(2画面目)を作ってみようと思います。

Java人によるObjective-C挑戦
posted by itokami1123 at 08:51| Comment(0) | 日記