見出し画像

【Objective-C】子VC→親VCへの値受け渡しをDelegateを実装して行ってみる。#Delegate #初心者向け #Xcode10

こういう人に向けて発信しています。
・Objective-C初心者
・Delegate処理について自分で書けない人
・Delagteのイメージを掴めない人

今回のnoteで実装できること

親ViewControllerがあり、子ViewControllerがあり、
子でボタンを押下したときに子ViewCotroller内にある、
テキストフィールド(検索窓的なもの)の値を親ViewControllerに渡す事が出来ます。

Delegateによる値に受け渡しといえます。


そもそもDelegateとは

日本語では委譲と翻訳され、処理を依頼する事を指します。

今回の場合は、delegateする側にあたるのは「子」です。
delegateする側とdelagateされる側についてはこんがらがるので、
一度整理して考えてましょう。
何かしらの処理が終わったタイミングで通知を送るのは今回は子です。

子「ボタンが押されたから後の処理はお願いします」
親「ん、なんかどっかから通知きた。言われた指示書通り仕事せねば!」
みたいなイメージです。

アプリイメージ図


なんとなくイメージは掴んでいただけましたでしょうか。

実装について(通知送る側) -SecondViewController.h

#import <UIKit/UIKit.h>
NS_ASSUME_NONNULL_BEGIN

//追記部分
@protocol  igaDelegate<NSObject>
-(void)showString:(NSString *)string;
@end
//追記部分終わり

@interface SecondViewController : UIViewController
//追記部分
@property(weak,nonatomic)id <igaDelegate>delegate;
//追記部分終わり
@end
@protocol  igaDelegate<NSObject>
-(void)showString:(NSString *)string;
@end
//これらはしっかりと記載してください。
//-(void)showStringに関してはDelegate通知受ける側のメソッドを記載してください。
@property(weak,nonatomic)id <igaDelegate>delegate;
//Delegateをプロパティ宣言して下さい。

実装について(通知送る側) -SecondViewController.m

#import "SecondViewController.h"

@interface SecondViewController ()
@property (weak, nonatomic) IBOutlet UITextField *textField;
@property (weak, nonatomic) IBOutlet UIButton *backBtn;
@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)backBtnMethod:(id)sender {
    //delegateオブジェクトがdelegateメソッドを実装しているか判定します。
    if ([self.delegate respondsToSelector:@selector(showString:)]) {
        [self.delegate showString:self.textField.text];
    }
    [self dismissViewControllerAnimated:YES completion:nil
     ];
}

@end
        [self.delegate showString:self.textField.text];
//こちらの一文でデリゲートに処理をお願いしています。

実装について(通知受ける側) -ViewController.h

//特に記述必要なし

実装について(通知受ける側) -ViewController.m

#import "ViewController.h"
#import "SecondViewController.h"
//遷移先のビューコントローラのインスタンスを生成する為に読み込みが必要。

@interface ViewController ()<igaDelegate>
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;
@property (weak, nonatomic) IBOutlet UIButton *nextViewBtn;
@property (strong, nonatomic) SecondViewController *secondView;

- (IBAction)nextView:(id)sender;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    _secondView = [SecondViewController new];
    _secondView.delegate = self; //追記
}

- (IBAction)nextView:(id)sender {
    [self presentViewController: _secondView animated:YES completion: nil];
}

-(void)showString:(NSString *)string{
    self.resultLabel.text = string;
}

@end
@interface ViewController ()<igaDelegate>
//こちらも忘れずに

#import "SecondViewController.h"
//遷移先のビューコントローラのインスタンスを生成する為に読み込みが必要。
//Delegateを処理する際にimportする必要はありますので、importしてください
    _secondView = [SecondViewController new];
    _secondView.delegate = self; //追記
//インスタンスを生成してdelegateの処理を_secondView.delegateをselfで指定する必要があります。
-(void)showString:(NSString *)string{
    self.resultLabel.text = string;
}
//通知送る側のhファイルで@protocol内に記載したメソッドを書いて下さい。

この記事が気に入ったらサポートをしてみませんか?