2011年11月16日

xcodeのstoryboardで画面遷移してみた(その2)

Java人によるObjective-C挑戦

前回の続きです。
モーダルの2画面目から値付きで1画面目に戻します。

まず、2画面目のdelegateを1画面目にする為
プロパティを用意します。(javaで言うインターフェース)


// SeccondViewDelegate.h
#import
@protocol SecondViewDelegate
- (void) secondClose:(NSString*)text;
@end


2画面目のControllerヘッダに
delegate格納先とテキストボックスのアウトレット
後、ボタン押した時に動くメソッドを準備します。

// SecondViewController.h
#import
#import "SecondViewDelegate.h"

@interface SecondViewController : UIViewController

// インスタンス変数は @propertyにする ★ 2011/11/19 修正
@property (nonatomic,retain) IBOutlet UITextField *textFiled;
// 自身のdelegate先(1画面目を設定するのでassign) ★ 2011/11/19 修正
@property (assign) id delegate;

// 画面1へボタンを押した場合
- (IBAction)moveToOneBtnDidPush:(id)sender;

@end


そいで実装します。

// SecondViewController.m
#import "SecondViewController.h"
@implementation SecondViewController
@synthesize textFiled;
@synthesize delegate;
・・・省略・・・
- (void)dealloc {
self.textFiled=nil;
self.delegate =nil;
[super dealloc];
}
- (IBAction)moveToOneBtnDidPush:(id)sender {
NSString *text = [self.textFiled text];
[delegate secondClose:text];

}
@end


storyBoardで画面遷移すると以下メソッドが呼ばれるとの事

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

なのでそのタイミングで1画面目(親画面)をdelegateとして設定します。
★呼び出しもと(今回は1画面目)に実装します★

// ViewController.m
#import "ViewController.h"
@implementation ViewController

・・・省略・・・
- (void) secondClose:(NSString*)text{
NSLog(@"secondClose");
[self dismissModalViewControllerAnimated:YES];
[self.textLabel setText:text];

}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"move001"]) {
SecondViewController *viewController = (SecondViewController*)[segue destinationViewController];
viewController.delegate = self;
}
}
・・・省略・・・

@end

そうすれば親画面のsecondCloseメソッドをモーダル画面から呼べ
値をセットすることが出来ます。

実行結果のスクリーンショット↓です。
storyBoard012.jpg
storyBoard013.jpg
storyBoard014.jpg
storyBoard015.jpg


-- (2011/11/19) 以下、2点修正しました。---
// インスタンス変数(メンバ変数)は @propertyにする
@property (nonatomic,retain) IBOutlet UITextField *textFiled;
self.textFiled = 値 とすると自動で前回の値のリリースと今回の値のretainを行ってくれるため
また、今後はdeallocで self.textFiled = nilで release を行おうと思います。
この方法ですと assign,retain関係なく解放できコーディングミスが減るからです。

// 自身のdelegate先(1画面目を設定するのでassign) ★ 2011/11/19 修正
@property (assign) id delegate;
これは、申し訳ないです。。
retainではメモリリークの原因になりかねない良くない書き方でした。。
ちなみにdeallocにはこちらも nil を指定しようと思います。


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

メールアドレス:

ホームページアドレス:

コメント: