いろいろなHPを参考にしても、なかなかうまくいかなかったコレ。
わかりやすく解説したいと思います!
#前提
・値をうけとるViewController -> もらう.h, もらう.m
・渡す値をつくるViewController -> つくる.h, つくる.m
・もしStoryboardをつかうなら、ViewControllerのひもづけをしておく
#つくる.hでdelegateの宣言
@protocol つくるDelegate;
@interface つくる: UIViewController{
//もともとあるやつ
}
@property (weak, nonatomic) id<つくるDelegate> delegate;
// イニシャライザ
- (id)init;
//「おくる」側で値をセットするための関数
-(void)セット;
@end //これももともとある
@protocol つくるDelegate <NSObject>
// 「もらう」で呼び出すためのメソッド「おくる」、ここでは送る値はNSString
- (void)おくる:(NSString*)str;
@end
#つくる.mでイニシャライズ&値をセット
- (id)init
{
if (self = [super init]) {
// 初期処理
}
return self;
}
- (void)せっと {
NSString *str = @"おくる値だよー";
[self.delegate おくる:str];
}
を書き加えておきます。
この「せっと」はあるボタンを押したときのイベントにすることも可能です。
そこのあたりは適宜書き換えてみてください。ヘッダーもあわせるのを忘れずに。
#もらう.hでインクルード、デリゲートを追加
//#importがあるところに追加
#import "つくる.h"
@interface もらう : UIViewController<つくるDelegate>{
//もともとあるところに<>で追加!
}
#もらう.mにおくるメソッドと、つくる.mにうつるためのメソッドを追加
うつるためのメソッドは、Storyboardをつかう場合とそうでない場合の2通りあります!
- (void)おくる:(NSString*)str
{
//受け取った値をlogに表示
NSLog(@"%@", str);
//「つくる」を閉じる
[self dismissViewControllerAnimated:YES completion:NULL];
}
//Storyboardをつかわない編
-(void)いどう{
// 遷移先の「つくる」のインスタンスを取得
つくる *つくる = [[つくる alloc] init];
つくる.delegate = self;
[self presentViewController:つくる animated:YES completion:nil];
}
//Storyboadをつかう編
- (void)いどう:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:@"つくるをひらく"]) {
//ここは、Storyboardで設定しなければいけないところ。
//ModalでViewController同士をつないで、そのModalの●を選んで、
//IDに「つくるをひらく」と入れた場合です。
つくる *つくる = segue.destinationViewController;
つくる.delegate = self;
}
}
この移動のところがわりとみそかなって思っています。
いかがでしょうか。日本語の部分を適宜おきかえてくださいね。
誤りなどあれば訂正コメントください!
も、もしかしてiOSの投稿1000個目…!?