質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Q&A

解決済

2回答

6886閲覧

他クラスの変数の中身を別のクラス内で参照する方法

mm--_--mm

総合スコア113

Objective-C

Objective-Cはオブジェクト指向型のプログラミング言語のひとつです。C言語をベースにSmalltalkが取り入れられています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

0グッド

0クリップ

投稿2016/01/11 06:27

いつもお世話になっております。

表題の件ですが、他クラスでセットした値を他のクラスで参照したいと考えていますが、NSLogで確認してもnullと表示されてしまいます...
この問題の解決方法がわかる方がおりましたら教えていただけると幸いです。

よろしくお願いいたします。

下記はサンプルコードです。

VIewController.h

objective

1@interface ViewController : UIViewController{ 2 NSString *_hoge; 3} 4@property (nonatomic,retain)NSString *hoge; 5@end 6

VIewController.m

objective

1#import "ViewController.h" 2#import "TestVIew2.h" 3@interface ViewController () 4 5@end 6 7@implementation ViewController 8 9@synthesize hoge = _hoge; 10 11- (void)viewDidLoad { 12 [super viewDidLoad]; 13 14 _hoge = @"TEST"; 15 NSLog(@"_hoge = %@",_hoge); //ここはTESTと表示される 16 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 17 btn.frame = CGRectMake(50, 100, 100, 30); 18 [btn setTitle:@"ボタン" forState:UIControlStateNormal]; 19 [btn addTarget:self action:@selector(hoge:) 20 forControlEvents:UIControlEventTouchDown]; 21 [self.view addSubview:btn]; 22 23 24} 25-(void)hoge:(UIButton*)button{ 26 UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 27 TestVIew2 *testviewcontroller = [storyboard instantiateViewControllerWithIdentifier:@"test2"];// 遷移先のViewControllerをStoryBoardをもとに作成 28 29 [self.navigationController pushViewController:testviewcontroller animated:YES]; //画面をPUSHで遷移させる 30} 31- (void)didReceiveMemoryWarning { 32 [super didReceiveMemoryWarning]; 33 // Dispose of any resources that can be recreated. 34} 35 36@end

TestView2.m

objevctive

1 2#import "TestVIew2.h" 3#import "ViewController.h" 4@implementation TestVIew2 5 6- (void)viewDidLoad { 7 [super viewDidLoad]; 8 9 ViewController* vc = [[ViewController alloc] init]; 10 NSLog(@"test = %@",vc.hoge); //結果がnullになってしまう。 11 12 13}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

遷移元であるViewControllerを参照したいのだと思いますが、

objectivec

1ViewController* vc = [[ViewController alloc] init]; 2NSLog(@"test = %@",vc.hoge); //結果がnullになってしまう。

これでは、新たに作成したViewControllerを参照することになってしまいます。

「一つ前」ということで、相対的にViewControllerを取得するのであれば、Navigation Controllerに保存されているView Controllerの配列viewControllersを参照して、

objectivec

1ViewController *vc = self.navigationController.viewControllers[self.navigationController.viewControllers.count-2];

これで取得できると思います。(未確認)

絶対的にViewControllerを取得したいなら、ViewControllerのインスタンスをどこかに保存しておいて、それを参照すればよいと思います。(Stripeさんの回答はこういうことだと思います)

投稿2016/01/11 08:22

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2016/01/11 09:05

ご回答いただきありがとうございます。 教えていただいたのを試してみたところ、-[__NSArrayI objectAtIndex:]: index 18446744073709551615 beyond bounds [0 .. 0]'というエラーが出てきてうまくいきませんでした... ViewControllerのインスタンスをどこかに保存しておいてということはViewController.mの中で、 ViewController* vc = [[ViewController alloc] init];を記述するということでしょうか?
fuzzball

2016/01/11 09:39

あれ、viewDidLoadの中だと-2じゃなくて-1じゃないといけないのかな。もし暇だったら-1で試してみて下さい。これ以上は、現在環境が無いので確かめられません。
fuzzball

2016/01/11 09:41

>>ViewController* vc = [[ViewController alloc] init];を記述するということでしょうか? 違います。ViewControllerの中に書くなら、self(自分自身)を保存しないといけません。(なんでそうやってすぐに新しいインスタンスを作りたがるのか‥)
mm--_--mm

2016/01/11 10:04

すいません...-2でできました。こちらの勘違いでした... 新しく生成してしまいますね...知識がなくて申し訳ありません... 後、selfを保存するために使用する変数の型は何が適切なのでしょうか...
fuzzball

2016/01/11 10:37

ViewControllerのselfですからViewController *です。
mm--_--mm

2016/01/11 11:51

なるほど! ViewController *vc1 = self;という風に記述し、別クラスでこの値を参照するために,ViewController.mに@synthesize vc2 = vc1;と記述し、 参照したいクラスではViewController *vc3 = vc3.vc2; という風にしてみたら EXC_BAD_ACCESSとなってしまいました... まず、この保存したselfを参照する方法を教えていただきたいです....
fuzzball

2016/01/13 01:44

例外については、コードが断片的で何がどうなっているのかさっぱり分からないのでスルーしますが、別クラスからselfを参照するために、インスタンス変数に保存しても意味が無いことが分かるでしょうか?
mm--_--mm

2016/01/13 04:13

ご回答いただきありがとうございます。 意味がないというのはselfの中身がNSLogとかで確認するとアドレスとして表示されるから意味がないということでしょうか?
fuzzball

2016/01/13 04:31

ViewControllerのインスタンスを自身のインスタンス変数に保存したとして、他のViewControllerから、どうやってそのインスタンス変数にアクセスするのですか?
mm--_--mm

2016/01/13 04:41

考えられる方法としては上記に記述していたvc.hogeのようにやれば良いのかと思っていたのですが、それではうまくいかなかったので,他のやり方があるのかどうかよくわかりません....
fuzzball

2016/01/13 04:46 編集

うまくいく、いかない以前に、vc.hogeって書いてる時点でvc(ViewControllerのインスタンス) が分かってるってことですよね。.hogeにアクセスする必要がないですよね?
mm--_--mm

2016/01/13 04:58

確かにViewController *vc = self.navigationController.viewControllers[self.navigationController.viewControllers.count-2];でViewControllerのインスンタンスは取得できていることは理解しています。 話が飛んでいるようで申し訳ありませんが、別のやり方(インスタンスを保存してそれを参照する)の時はどこに保存してどう取得するのかというのがわからない状況です...
fuzzball

2016/01/13 13:14 編集

ViewController自身がダメなら、それ以外に保存すればいいんですよ。 ViewControllerがTestView2を作っているのですから、作った時にTestView2に渡してやるとか、もう少し広範囲から見えるようにしたいならNavigationControllerに保存するとか、誰からでも見えるようにしたいならAppDelegateに保存するとかシングルトンを使うとか。
mm--_--mm

2016/01/13 06:01

そういったやり方があるのですね... Appdelegateとかシングルトンとかよくわからないですが調べてやってみます。
mm--_--mm

2016/01/13 12:18

Appdelegateを使用することで無事に解決できました! 長々とお付合いいただきありがとうございました!
guest

0

ViewControllerクラスのインスタンス変数を参照したいなら、まず最初にViewControllerのインスタンスを参照してください。

投稿2016/01/11 07:17

Stripe

総合スコア2183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mm--_--mm

2016/01/11 07:28

ご回答いただきありがとうございます。 ViewControllerのインスタンスはこちらで記述はしていないのですが、どのように参照したら良いのでしょうか?
Stripe

2016/01/11 08:25

ViewControllerクラスとTestVIew2クラスは、どのような関係や関連がありますか? それが分からないと、ViewControllerのインスタンスを参照する方法は分かりません。
mm--_--mm

2016/01/11 08:49

関連としてはviewControllerにあるボタンを押すとTestView2の画面に遷移するような形にしています。なのでViewController.mにTestView2.h, TestView2.mにviewController.hをimportさせているような状況です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問