- ベストアンサー
Xcodeの変数宣言について
複数のtouchイベントに同じ変数を使用したいのですが宣言はどこですればよいのでしょうか? ViewController.m、ViewController.hで宣言してみたのですが不適切だったようでエラーが出ました。使用したいのはViewController.mの中の複数のアクションです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> アクションtouchbutton1で使用するkekkaとnowを他のアクションでも使用できるように宣言したいのですが分かりませんでした 変数int kekkaをグローバル変数にする理由がありません。ローカル変数のままで問題ありません。kekkaに値を代入したあと、すぐに変数int nowに同じ値を代入してますから。nowだけグローバル変数にすればいいのです。 グローバル変数を書く場所については、C言語の変数の有効範囲で習ったことを思い出してください。習った覚えがないというのでしたら、忘れたか、見落としたか、寝ていたかのどれかです。変数は直近のスコープ({から}の範囲)が有効範囲となり、それを超えるとバッファ開放されます。グローバル変数にするには、いちばん外側に書けばいいことになります。それは@implementationの次の行でもいいでしょうし、インスタンス変数として、@interfaceに書いてもいいでしょう。 @interface _touchViewController : UIViewController { UIButton *button1; UIButton *button2; UIButton *button3; UIButton *button4; UIButton *button5; UIButton *button6; UIButton *button7; UIButton *button8; UIButton *button9; UIButton *startbutton; int now; } たとえばこう書きます。(なお、このスコープは、関数、メソッドのスコープと意味と働きが違います) 以下蛇足: > @interface _touchViewController : UIViewController クラス名は大文字で始めるという命名規則になっています。この場合「TouchViewController」というようにするのが規則に沿う形です。命名規則に従わなくても、コンパイルエラーになるとかはありませんが、クラス名とインスタンス名の区別ができなくなって、遠からず人為的ミスが発生するでしょう。なお、インスタンス名はそれに対して小文字で始める規則になっています。 インスタンス変数は、最初に初期化しておきましょう。「_touchViewController」クラス自体は、Nibファイル(.xib)から生成される場合、「- (void)viewDidLoad」メソッドで初期化されるので、ここでnowを初期化します。 - (void)viewDidLoad { [super viewDidLoad]; now = 0; } > //if (now = 0) { 超初歩的ミス。正しくは、 if (now == 0) { UIButton(UIControl)のプロパティ「selected」の切り替えで、画像の切り替えをするのがかんたんですよという、私のアドバイスを採用していただけなかったのは、ざんねんです。
その他の回答 (1)
- harawo
- ベストアンサー率58% (3742/6450)
あなたには、以前指摘させていただいたことですが、ソースコード現物を見せずに、アドバイスを求められても、答えようがありません。 抽象的な回答でかまわないのであれば、インスタンス変数、C言語のグローバル変数として、しかるべき場所(Objective-C、C言語の教科書に、その場所は書かれています)に宣言するというしかありません。 ところで、宣言しただけで初期化していないのが原因でエラーが出ることもありますよ。それは疑わなかったのですか?
補足
すみませんでした。おっしゃる通りです。 ViewController.hのソースコード #import <UIKit/UIKit.h> @interface _touchViewController : UIViewController { UIButton *button1; UIButton *button2; UIButton *button3; UIButton *button4; UIButton *button5; UIButton *button6; UIButton *button7; UIButton *button8; UIButton *button9; UIButton *startbutton; } @property (nonatomic, retain) IBOutlet UIButton *button1; @property (nonatomic, retain) IBOutlet UIButton *button2; @property (nonatomic, retain) IBOutlet UIButton *button3; @property (nonatomic, retain) IBOutlet UIButton *button4; @property (nonatomic, retain) IBOutlet UIButton *button5; @property (nonatomic, retain) IBOutlet UIButton *button6; @property (nonatomic, retain) IBOutlet UIButton *button7; @property (nonatomic, retain) IBOutlet UIButton *button8; @property (nonatomic, retain) IBOutlet UIButton *button9; @property (nonatomic, retain) IBOutlet UIButton *startbutton; -(IBAction)startbutton:(id)sender; -(IBAction)touchbutton1:(id)sender; @end ViewController.mのソースコード #import "ViewController.h" @implementation _touchViewController @synthesize button1; @synthesize button2; @synthesize button3; @synthesize button4; @synthesize button5; @synthesize button6; @synthesize button7; @synthesize button8; @synthesize button9; @synthesize startbutton; // //Override to allow orientations other than the default portrait orientation. - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return YES; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (void)viewDidUnload { } -(IBAction) startbutton:(id)sender{ //now = 0; [button1 setImage:[UIImage imageNamed:@"yellow.jpg"] forState:UIControlStateNormal]; } -(IBAction) touchbutton1:(id)sender{ //if (now = 0) { [button1 setImage:[UIImage imageNamed:@"blue1.jpg"] forState:UIControlStateNormal]; //ボタン0を通常に戻す //kekka = arc4random() % 9; //kekkaのボタンを黄色にする //now = kekka; //} } - (void)dealloc { [super dealloc]; } @end 他は初期のままです。 アクションtouchbutton1で使用するkekkaとnowを他のアクションでも使用できるように宣言したいのですが分かりませんでした…
お礼
丁寧な解答、また指摘ありがとうございました。 ボタンのプロパティの切り替えで行う手法でも勉強のため今後作成したいと思います。宣言については少し勘違いをしていました。本当にありがとうございました。