追記分: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];
}