[解決済み] dismissModalViewControllerとデータの受け渡し
質問
2つのビューコントローラがあります。 firstViewController と secondViewController . 私はこのコードを使ってsecondViewControllerに切り替えています(文字列も渡しています)。
secondViewController *second = [[secondViewController alloc] initWithNibName:nil bundle:nil];
second.myString = @"This text is passed from firstViewController!";
second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:second animated:YES];
[second release];
そして、secondViewControllerでこのコードを使って、firstViewControllerに切り替えています。
[self dismissModalViewControllerAnimated:YES];
これらはすべて問題なく動作します。質問ですが、firstViewControllerにどのようにデータを渡せばいいのでしょうか?secondViewControllerからfirstViewControllerに違う文字列を渡したいのですが。
どのように解決するのでしょうか?
デリゲートプロトコルを使用する必要があります... その方法を説明します。
secondViewControllerのヘッダーファイルでプロトコルを宣言してください。以下のような感じです。
#import <UIKit/UIKit.h>
@protocol SecondDelegate <NSObject>
-(void)secondViewControllerDismissed:(NSString *)stringForFirst
@end
@interface SecondViewController : UIViewController
{
id myDelegate;
}
@property (nonatomic, assign) id<SecondDelegate> myDelegate;
実装(SecondViewController.m)ファイル内でmyDelegateを合成することを忘れないでください。
@synthesize myDelegate;
FirstViewControllerのヘッダーファイルで、以下のようにしてSecondDelegateプロトコルをサブスクライブしてください。
#import "SecondViewController.h"
@interface FirstViewController:UIViewController <SecondDelegate>
さて、FirstViewControllerの中にSecondViewControllerをインスタンス化するときは、以下のようにする必要があります。
// If you're using a view controller built with Interface Builder.
SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]];
// If you're using a view controller built programmatically.
SecondViewController *second = [SecondViewController new]; // Convenience initializer that uses alloc] init]
second.myString = @"This text is passed from firstViewController!";
second.myDelegate = self;
second.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentModalViewController:second animated:YES];
[second release];
最後に、最初のビューコントローラの実装ファイル(FirstViewController.m)において、SecondDelegateのsecondViewControllerDismissedのメソッドを実装してください。
- (void)secondViewControllerDismissed:(NSString *)stringForFirst
{
NSString *thisIsTheDesiredString = stringForFirst; //And there you have it.....
}
さて、2つ目のビューコントローラを終了させようとするとき、1つ目のビューコントローラに実装されているメソッドを呼び出したいと思います。この部分は簡単です。2 番目のビューコントローラの dismiss のコードの前に、いくつかのコードを追加するだけです。
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
デリゲートプロトコルは非常に、非常に、非常に便利です。それらに精通することは良いことです :)
NSNotificationsはこれを行う別の方法ですが、ベストプラクティスとして、私は複数のviewControllerまたはオブジェクトにわたって通信したいときにこれを使用することを好みます。NSNotificationsの使用について興味がある方は、以前投稿した回答をご覧ください。 appdelegateのスレッドから複数のビューコントローラーにまたがるイベントを発生させる
EDITです。
複数の引数を渡したい場合、dissue前のコードはこのようになります。
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:argument2:argument3:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!" argument2:someObject argument3:anotherObject];
}
[self dismissModalViewControllerAnimated:YES];
つまり、firstViewControllerの中のSecondDelegateメソッドの実装は以下のようになります。
- (void) secondViewControllerDismissed:(NSString*)stringForFirst argument2:(NSObject*)inObject1 argument3:(NSObject*)inObject2
{
NSString thisIsTheDesiredString = stringForFirst;
NSObject desiredObject1 = inObject1;
//....and so on
}
関連
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] iOSの配布証明書の正しい更新方法
-
[解決済み] iOS UITableViewのHeaderView(セクションヘッダーではない)を追加する
-
[解決済み] Xcode 4.2 - '...' の宣言は、この関数の外では表示されません 警告
-
[解決済み] iOSアプリでターゲットのバージョン/ビルド番号をプログラム的に表示するには?
-
[解決済み] drawRectを使うか使わないか(drawRect/Core Graphicsとsubview/imagesをいつ使うか、なぜ使うか)?
-
[解決済み] Objective-C用JSONパーサーの比較(JSON Framework、YAJL、TouchJSON、etc.)
-
[解決済み] Xcodeで非推奨の警告を抑制する
-
[解決済み] iPhoneシミュレーター - 低速接続をシミュレートする?
-
[解決済み] MKMapViewのズームレベル設定
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] UILongPressGestureRecognizerが押し下げ時に2回呼び出される
-
[解決済み] xcodeでiOSアプリのアーカイブを生成できない
-
[解決済み] Xcode 4.2 - '...' の宣言は、この関数の外では表示されません 警告
-
[解決済み] iPhoneでMonoTouchは禁止になったのか?[クローズド]
-
[解決済み] iOSアプリでターゲットのバージョン/ビルド番号をプログラム的に表示するには?
-
[解決済み] CALayer setNeedsDisplayInRect:] の暗黙のアニメーションを無効にする。
-
[解決済み] UIImageViewのコーナー半径の設定がうまくいかない
-
[解決済み] Mac OS Xのスタティック・ライブラリ(.a)のターゲット・アーキテクチャはどのように決定するのですか?
-
[解決済み] iPhoneシミュレーターの位置情報
-
[解決済み] iPhoneでNSStringをAES暗号化する方法