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]; }