追記分:Storyboard+TabBarでボタンを押してデータを送信
更にStoryboard+Tabbarでボタンを押して次のタブへデータを送るコード書きました。
コードのダウンロードは以下です。
GitHub - prince9/SBTabDataSend: Sent data to the next Tab using Storyboard.TabBarでStoryboardを使ってデータの受け渡しをします
タブの切り替えでデータの送信を行っているのではなく、別途ボタンを設置してそのボタンを押してデータを送ってます。前のタブに戻ってデータを確認したい、データ入力を確定させてからデータを送りたいという場合に使用できるかと思います。
Viewの追加は特に必要なく、Tabbed Applicationを選択して新しくプロジェクトを作ります。後はUI設置&関連づけをして、追記分を書くだけでOK。
TabBarで注意しなければいけないのは、普段viewDidLoadに書くような処理をviewWillAppearに書かなければいけない点です。
おそらく読み込みの順番のせいだと思いますが、viewDidLoadに書くと正常に動かないので注意してください。
以下が追加するコードになります。新規プロジェクトを作ったときに既に追加されているコードは所々省いていることがあります。詳細は上のサンプルでご確認ください。
・AppDelegate.h
@interface AppDelegate : UIResponder <UIApplicationDelegate> { //追加 NSString *labelData1; //スライダのデータを送る変数 NSString *labelData2; //TextFieldに入力されたデータを送る変数 } ... //labelData1、labelData2というプロパティを作る @property (strong, nonatomic) NSString *labelData1; @property (strong, nonatomic) NSString *labelData2;
・FirstViewController.h
@interface FirstViewController : UIViewController @property (weak, nonatomic) IBOutlet UISlider *mySlider; @property (weak, nonatomic) IBOutlet UITextField *myField; //キーボードを隠すボタン - (IBAction)KeyHide:(id)sender; //データを送るボタン - (IBAction)detaSend:(id)sender;
・FirstViewController.m
#import "FirstViewController.h" #import "AppDelegate.h" @implementation FirstViewController @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;
・SecondViewController.m
#import "SecondViewController.h" #import "AppDelegate.h" @implementation SecondViewController @synthesize myLabel1; @synthesize myLabel2; ... //画面が表示される直前に実行される処理を書く。TabBarの場合、- (void)viewDidLoadに以下の処理を書くと正常に表示されない - (void)viewWillAppear:(BOOL)animated { //データを受け取って、ラベルに表示する AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; myLabel1.text = appDelegate.labelData1; myLabel2.text = appDelegate.labelData2; [super viewWillAppear:animated]; }