デリゲートプロトコルを使用する必要があります...その方法は次のとおりです。
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をインスタンス化するときに、次のことを行う必要があります。
SecondViewController *second = [[SecondViewController alloc] initWithNibName:"SecondViewController" bundle:[NSBundle mainBundle]];
SecondViewController *second = [SecondViewController new];
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;
}
ここで、2番目のView Controllerを閉じようとしているときに、最初のViewControllerに実装されているメソッドを呼び出します。この部分は単純です。2番目のViewControllerで、却下コードの前にコードを追加するだけです。
if([self.myDelegate respondsToSelector:@selector(secondViewControllerDismissed:)])
{
[self.myDelegate secondViewControllerDismissed:@"THIS IS THE STRING TO SEND!!!"];
}
[self dismissModalViewControllerAnimated:YES];
デリゲートプロトコルは、非常に、非常に、非常に便利です。それらに慣れておくとよいでしょう:)
NSNotificationsはこれを行う別の方法ですが、ベストプラクティスとして、複数のviewControllerまたはオブジェクト間で通信する場合にNSNotificationsを使用することをお勧めします。NSNotificationsの使用に興味がある場合は、以前に投稿した回答を次に示します。次に示します。appdelegateのスレッドから複数のビューコントローラー間でイベントを発生させる
編集:
複数の引数を渡したい場合、却下する前のコードは次のようになります。
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;
}