まゆたまガジェット開発逆引き辞典

電子工作やプログラミングのHowtoを逆引き形式で掲載しています。作りたいモノを決めて学んでいくスタイル。プログラマではないので、コードの汚さはお許しを。参照していないものに関しては、コピペ改変まったく問いません

Storyboardでボタンを押してデータを送信

★追記しました。
Storyboard+TabBarでのデータ受け渡しの記事を下のほうに追加しました。

Storyboardを使ってデータのやりとりを・・・となると- (void)prepareForSegue:を使うのが一般的ですが、これだと次の画面へ行くボタンを押したときにしかデータが送信されません。
そこで、単純にボタンを押すとデータが送信されて次の画面で表示するというコードを書きました。
例のごとくサンプルをgithubに上げておきました。
GitHub - prince9/DataSendStoryboard: Button is pushed and data is sent to the next screen.Data is not transmitted by -(void)prepareForSegue: and data is transmitted by pushing a button.Storyboardを使ってデータの受け渡しをする一般的な方法である「 -(void)prepareForSegue:」を使わずにVIewとVIewでデータの受け渡しをしています。

流れとしては、AppDelegate.hで変数とプロパティを用意→ViewController.mでデータを送る準備→SecondViewController.mで受け取って表示するという感じです。

以下、追加するコードになります。コードを書く前にViewを追加したりなど少し準備がいりますので、詳しくはReadMeをご覧ください。
新規プロジェクトを作ったときに既に追加されているコードは所々省いていることがあります。詳細は上のサンプルでご確認ください。

・AppDelegate.h

@interface AppDelegate : UIResponder <UIApplicationDelegate> {
    NSString *labelData1; 
    NSString *labelData2; 
}
@property (strong, nonatomic) NSString *labelData1;
@property (strong, nonatomic) NSString *labelData2;

・ViewController.h

@interface ViewController : UIViewController
@property (weak, nonatomic) IBOutlet UISlider *mySlider;
@property (weak, nonatomic) IBOutlet UITextField *myField;

- (IBAction)KeyHide:(id)sender;
- (IBAction)detaSend:(id)sender;

・ViewController.m

#import "ViewController.h"
#import "AppDelegate.h"
@implementation ViewController
@synthesize mySlider;
@synthesize myField;
...

- (IBAction)KeyHide:(id)sender {
    //キーボードをしまう
    [myField resignFirstResponder];
}

//ボタンを押すとデータを送る
- (IBAction)detaSend:(id)sender {
    //データを送る準備
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    appDelegate.labelData1 = [NSString stringWithFormat:@"%f",mySlider.value];
    appDelegate.labelData2 = myField.text;
}

・SecondViewController.h

@interface SecondViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *myLabel1;
@property (weak, nonatomic) IBOutlet UILabel *myLabel2;

- (IBAction)goBack:(id)sender;

・SecondViewController.m

#import "SecondViewController.h"
#import "AppDelegate.h"

@implementation SecondViewController
@synthesize myLabel1;
@synthesize myLabel2;
...


- (void)viewDidLoad
{
    [super viewDidLoad];
    
    //データを受け取って、ラベルに表示する
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    myLabel1.text = appDelegate.labelData1;
    myLabel2.text = appDelegate.labelData2;
}

...

//前の画面に戻る。IBで接続するよりメモリ的にこうやって書いたほうが良いらしい
- (IBAction)goBack:(id)sender {
    [self dismissModalViewControllerAnimated:YES];
}