アラのアラアラしい日記

こっそりかいてます

objective-cでdelegateを使ってmodalのtextareaつくるよ

こんばんわ!
天一はこってりしか食べない人です。

最近会社でのポジションがウェッブエンジニアからiOSエンジニアになったのですが、
objective-cxcodeの文化ってありますね!初めてpython触った時のインデントみたいな!(雑)

という訳でmodalで出てきたウィンドウからテキストを入力して、
modalを閉じたら元の画面に入力したテキストが表示されてるっていうのを作るコードが
意外と分かりやすいマニュアルとか参考が少なかったのでメモしておきます。

元の画面名がFirstViewController, modal画面名がModalControllerです。

●FirstViewController.h

#import <UIKit/UIKit.h>

@interface FirstViewController : UIViewController {
}
@end

FirstViewController.hに関してはデフォルトのままで大丈夫です。

●FirstViewController.m

#import "FirstViewController.h"
#import "ModalController.h"

@interface FirstViewController ()
@property (weak, nonatomic) IBOutlet UILabel *viewLabel;
@end

@implementation FirstViewController

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

- (void)sendOkome:(NSString*) str {
    self.viewLabel.text = str;
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSString *genmaiText = self.viewLabel.text;
    ModalController *mCon = [segue destinationViewController];
    mCon.mydelegate = self;
    mCon.genmai = genmaiText;
}
@end

viewLabelはModalInputControllerで入力したテキストを表示する部分です。
ModalControllerに送りたい(ModalControllerインスタンスを使いたい)ので、初めにModalController.hをimportしておく必要があります。 prepareForSeguemethodでボタンが押された時にgenmaiとしてModalControllerにテキストを送ります。

●ModalController.h

#import <UIKit/UIKit.h>

@protocol ModalControllerDelegate
- (void)sendOkome:(NSString*)str;
@end

@interface ModalController : UIViewController <UITextViewDelegate> {
}
@property (nonatomic, weak) IBOutlet UITextView* textOkome;
@property (weak, nonatomic) IBOutlet NSString *genmai;
@property (nonatomic, retain) id mydelegate;

@end

受け取るデータの変数やdelegateの設定を行います。

●ModalController.m

#import "ModalController.h"

@interface ModalController ()
@end

@implementation ModalController
@synthesize textOkome, mydelegate, genmai;

- (void)viewDidLoad {
    [super viewDidLoad];
    textOkome.delegate = self;
    [textOkome becomeFirstResponder];
    textOkome.text = genmai;
}

- (BOOL) textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)textGenmai {
    if ([textGenmai isEqualToString:@"\n"]) {
        [textView resignFirstResponder];
        return NO;
    }
    return YES;
}

- (IBAction)pushBtn:(id)sender {
    if ([self.mydelegate respondsToSelector:@selector(sendOkome:)]) {
        [self.mydelegate sendOkome:textOkome.text];
    }
}
@end

受け取った値をtextview内に表示し、textview内にあるテキストをdelegateで取得しています。
最後にFirstViewController.mのsendOkomeメソッドを呼び出してそこでmodalウィンドウを閉じています。

試行錯誤で出来たものなので美しくないですがつんだら試してみてください。
説明がまじで下手くそなので後日追加するかもしれません。