前回の続きです。
モーダルの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) iddelegate;
// 画面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メソッドをモーダル画面から呼べ
値をセットすることが出来ます。
実行結果のスクリーンショット↓です。
-- (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
これは、申し訳ないです。。
retainではメモリリークの原因になりかねない良くない書き方でした。。
ちなみにdeallocにはこちらも nil を指定しようと思います。
Java人によるObjective-C挑戦