NSNotificationCenter、NSUserDefaults、またはグローバル変数を使用する必要はありません。
View Controllerが関連している限り(そしてOPの質問を見ると、それらは確かにそうです)、View Controllerを設定して相互への参照を保持することができます(参照の1つはもちろん弱いです「保持」または「強い参照」サイクルを避けてください)。次に、各View Controllerは、必要に応じて他のView Controllerのプロパティを設定できます。例は次のとおりです...
注意: この概念は、関連する 2 つのビュー コントローラーに対して有効です。ただし、次のコードは次のことを前提としています。
- 問題のビュー コントローラはナビゲーション コントローラを介して関連付けられ、2 番目のビュー コントローラはプッシュ セグエを介して最初のビュー コントローラに接続されます。
- iOS 5.0 以上を使用しています (ストーリーボードを使用するため)。
FirstViewController.h
@interface FirstViewController : UIViewController
/* Hold the boolean value (or whatever value should be
set by the second view controller) in a publicly
visible property */
@property (nonatomic, assign) BOOL someBooleanValue;
/* Provide a method for the second view controller to
request the first view controller to dismiss it */
- (void)dismissSecondViewController;
@end
FirstViewController.m
#import "FirstViewController.h"
#import "SecondViewController.h"
@implementation FirstViewController
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
/* Get the reference to the second view controller and set
the appropriate property so that the secondViewController
now has a way of talking to the firstViewController */
SecondViewController *vc = [segue destinationViewController];
vc.firstViewController = self;
}
- (void)dismissSecondViewController
{
// Hide the secondViewController and print out the boolean value
[self.navigationController popViewControllerAnimated:YES];
NSLog(@"The value of self.someBooleanValue is %s", self.someBooleanValue ? "YES" : "NO");
}
@end
SecondViewController.h
#import "FirstViewController.h"
@interface SecondViewController : UIViewController
// Create a 'weak' property to hold a reference to the firstViewController
@property (nonatomic, weak) FirstViewController *firstViewController;
@end
SecondViewController.m
@implementation SecondViewController
/* When required (in this case, when a button is pressed),
set the property in the first view controller and ask the
firstViewController to dismiss the secondViewController */
- (IBAction)buttonPressed:(id)sender {
self.firstViewController.someBooleanValue = YES;
[self.firstViewController dismissSecondViewController];
}
@end
もちろん、この種の viewController 間通信を処理する最も正しい方法は、SecondViewController がその親/所有者オブジェクトの詳細を知る必要がないように、プロトコル/デリゲート/データ ソースを使用することです。ただし、概念を証明するためだけに、このようなソリューションを構築する方が迅速/簡単な場合があります。次に、すべてが順調で、コードを保持する価値がある場合は、プロトコルを使用するようにリファクタリングします。
ビュー コントローラがお互いを認識していない (そして認識すべきではない) 場合は、NSNotificationCenter を使用する必要がある場合があります。ビュー コントローラー間の通信にグローバル変数または NSUserDefaults を使用しないでください。