iPhone SDK UIViewに追加したUIButtonが反応しない

このQ&Aのポイント
  • UIViewにボタンを追加した場合は反応するが、プログラムから追加したUIViewにボタンを置くと反応しない。
  • プロジェクト(buttonOnView)で、UIViewにボタンを追加すると反応し、UIViewからボタンを削除すると反応しない。
  • 初歩的な問題かもしれないが、ネットで検索しても解決策が見つからず困っている。助けていただけると幸いです。
回答を見る
  • ベストアンサー

iPhone SDK UIViewに追加したUIButtonが反応しな

iPhone SDK UIViewに追加したUIButtonが反応しない。。。 インターフェイスビルダーにあるUIViewにボタンを追加した場合は、 ちゃんとボタンは反応するんですが、プログラムから追加したUIViewにボタンをおくと UIControlEventTouchUpInsideのイベントに反応しません。 一応、こちらに簡単なプロジェクトもあげておきました。 http://gemic.jp/xcode/buttonOnView.zip 詳細は、下記です。 View-Based Applicationテンプレートで作成したプロジェクト(buttonOnView) buttonOnViewViewController.h #import <UIKit/UIKit.h> @interface buttonOnViewViewController : UIViewController { UIView *theView; } @end ----------------------------------------------------------------- buttonOnViewViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor redColor]; UIButton *btn1 = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain]; [btn1 initWithFrame:CGRectMake(60, 90, 200, 50)]; //このボタンは反応する↓ [self.view addSubview:btn1]; [btn1 setTitleColor:[UIColor redColor] forState:UIControlStateNormal]; [btn1 addTarget:self action:@selector(createView:) forControlEvents:UIControlEventTouchUpInside]; } - (IBAction)createView:(UIButton*)sender { theView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; [theView setBackgroundColor:[UIColor greenColor]]; [self.view addSubview:theView]; UIButton *btn = [[UIButton buttonWithType:UIButtonTypeRoundedRect]retain]; [btn initWithFrame:CGRectMake(60, 150, 200, 50)]; //このボタンは反応しない↓ [theView addSubview:btn]; [btn addTarget:self action:@selector(deleteView:) forControlEvents:UIControlEventTouchUpInside]; } - (IBAction)deleteView:(UIButton*)sender { NSLog(@"touch event reaction"); [theView removeFromSuperview]; } ----------------------------------------------------------------- いろいろググってみたり、DevCenterのドキュメントを探したんですが、 思ったような情報が見つからず相当はまってます。 ネットで探して見つからないってことは、凄く初歩的なことか?? と思ってるんですが、、、 どなたか、助けていただけたらありがたいです。

  • iBono
  • お礼率100% (1/1)

質問者が選んだベストアンサー

  • ベストアンサー
  • harawo
  • ベストアンサー率58% (3742/6450)
回答No.1

以下のように書き換えて、ビルドしてみてください。 - (void)viewDidLoad { [super viewDidLoad]; UIButton *btn1 = [UIButton buttonWithType: UIButtonTypeRoundedRect]; btn1.frame = CGRectMake(20, 20, 160, 36); [btn1 setTitle: @"Make Button" forState: UIControlStateNormal]; [btn1 addTarget: self action: @selector(makeButton:) forControlEvents: UIControlEventTouchUpInside]; [self.view addSubview: btn1]; } - (void)makeButton: (id)sender { theView = [[[UIView alloc] initWithFrame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)] retain]; theView.backgroundColor = [UIColor greenColor]; UIButton *btn2 = [UIButton buttonWithType: UIButtonTypeRoundedRect]; btn2.frame = CGRectMake(20, 60, 160, 36); [btn2 setTitle: @"Delete Button" forState: UIControlStateNormal]; [btn2 addTarget: self action: @selector(deleteButton:) forControlEvents: UIControlEventTouchUpInside]; [theView addSubview: btn2]; [self.view addSubview: theView]; } - (void)deleteButton: (id)sender { [theView removeFromSuperview]; NSLog(@"the button is pushed."); }

iBono
質問者

お礼

いろんなところを丁寧に直していただいてありがとうございます。 つまるところ、 theView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; ↓ theView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)]; ってことですよね。。 UIViewで動かないと思ったあと、UIImageViewで試して、UIViewに戻したつもりだったんですが。 こんなミスじゃ、どおりでググっても出てこないわけだ・・・ とにかく、どうもありがとうございます!

関連するQ&A

  • objective-cに関する質問です。

    objective-c初心者です。以下の参考書に載っていた初期化という処理についていまいち理解できません。 理解できない所は、何度も出てくるselfが何者なのか、というコトと、 [self.view addSubview:_textField]; このaddsubviewは何なのかということです。 調べても分からなかったので、親切な方教えて下さいますと幸いです。 よろしくお願い致します。 _____________________________ //初期化 - (void)viewDidLoad { [super viewDidLoad]; //テキストフィールドの生成 _textField=[self makeTextField:CGRectMake(10,20,300,32) text:@""]; [self.view addSubview:_textField]; //書き込みボタンの生成 UIButton* btnWrite=[self makeButton:CGRectMake(55,62,100,40) text:@"書き込み" tag:BTN_WRITE]; [self.view addSubview:btnWrite]; //読み込みボタンの生成 UIButton* btnRead=[self makeButton:CGRectMake(165,62,100,40) text:@"読み込み" tag:BTN_READ]; [self.view addSubview:btnRead]; }

  • objectiv-cで困っています。教えてください

    objectiv-cの初心者でをトライ&エラーで試しながら学習しているのですが、基本的な部分で 行き詰っており、知恵をお借りしたいと思い投稿しました。 デバイスのサイズや向きが変わってもUIViewが中央に表示させたいのですが、 UIView *uv = [[UIView alloc] initWithFrame:CGRectMake(0,0,100,100)]; uv.contentMode = UIViewContentModeCenter; uv.backgroundColor = [UIColor redColor]; [self.view addSubview:uv]; としてみました。initWithFrame:CGRectMakeの部分で0,0を指定しているので左上に表示されるのは分かるのですが、サイズだけを指定してUIViewを生成する方法が分かりません。CGSizeMakeでしていした後どうすればよいのでしょうか? 中央に表示させるのにuv.contentMode = UIViewContentModeCenter;としたのですが、使い方が間違っているのでしょうか? 十分ではないかもしれませんが、調べてはみたのですが、解決できませんでした。 宜しくお願いします。

  • Objective-c ボタンの動的配置

    ボタンを以下のように、動的に配置していますが、画像がぼやけて表示されてしまいます。 調べると、座標の指定が整数値でない場合、この問題が起こったりするようなのですが、 整数値にしても奇麗に表示されません。。 どなたか、お分かりになる方教えて下さい。 myButton = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *myImage = [UIImage imageNamed:[NSString stringWithFormat:@"test.png"]]; [myButton setImage:myImage forState:UIControlStateNormal]; [myButton] setFrame:CGRectMake(100,100,200,200)]; [myButton addTarget:self action:@selector(test:) forControlEvents:UIControlEventTouchUpInside]; [scrollView addSubview:myButton ];

  • objective-cでUIButtonを作成後

    xcodeのobjective-cで書いています。 UIButtonをプログラムで複数生成し、 その後別のボタンを作成し、そのボタンを押したら任意のボタンを削除(隠すのではなく)する方法を模索しています。 @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. for (int i = 0; i < 5; i++) { UIButton *bt = [UIButton buttonWithType:UIButtonTypeRoundedRect]; bt.frame = CGRectMake(20.0f, 20.0f + (i * 25), 20.0f, 20.0f); bt.tag = i; [bt addTarget:self action:@selector(pushBt:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:bt]; } } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } - (IBAction)pushBt:(UIButton *)sender { [sender removeFromSuperview]; } 押したボタンを消す事はできるようなのですが、 一度に全て消す、tagの1と2を消す等の方法や考え方などご教授お願いします。

  • ナビゲーションバーのタイトルを2行で表示

    ObjctiveCを用いてiPhoneApp開発の勉強をしています。 タイトルの通り、ナビゲーションバーのタイトルを2行で表示させたいのですがうまくできないので助言をいただきたいです。 こちらのサイトを参考に進めました。 (参考)http://www.yoheim.net/blog.php?q=20121203 こちらのコードをコピペするといろいろとエラーが出てしまうのですが、 まず一行目に表示するラベルのaddSubviewするところで、 [titleView addSubview:taskMessageLabel]; のように記述されていますが、まだtaskMessageLabelは作成されていません。 また、二行目に表示するラベルのtaskMessageLabelはUILabel *taskMessageLabelとすると思うのですが、それもされていません。 いろいろと手直しをし、以下のようにしたのですが、二行目のサブタイトルしか表示されませんでした。 どのようにすれば、きちんと二行でタイトルを表示することができるのでしょうか? 回答お待ちしてます // ナビゲーションバーのtitleに表示する独自Viewを作成します。 UIView *titleView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 40)]; titleView.backgroundColor = [UIColor clearColor]; titleView.opaque = NO; // ☆☆ポイントはここ!! // 以下のように代入して、タイトルに独自Viewを表示します。 self.navigationItem.titleView = titleView; // 1行目に表示するラベルを作成して、 // 上記で作成した独自Viewに追加します。 UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 195, 20)]; titleLabel.font = [UIFont boldSystemFontOfSize:16.0f]; titleLabel.text = @"RSS"; titleLabel.textColor = [UIColor whiteColor]; titleLabel.textAlignment = NSTextAlignmentCenter; titleLabel.backgroundColor = [UIColor clearColor]; [titleView addSubview:titleLabel]; // 2行目に表示するラベルを作成して、 // 上記で作成した独自Viewに追加します。 UILabel *taskMessageLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 20, 195, 40)]; taskMessageLabel.font = [UIFont boldSystemFontOfSize:10.0f]; titleLabel.text = @"サブタイトル"; taskMessageLabel.textColor = [UIColor colorWithRed:104.0f/255.0f green:100.0f/255.0f blue:100.0f/255.0f alpha:1.0f]; taskMessageLabel.textAlignment = NSTextAlignmentCenter; taskMessageLabel.backgroundColor = [UIColor clearColor]; taskMessageLabel.adjustsFontSizeToFitWidth = YES; [titleView addSubview:taskMessageLabel];

  • objective-C メソッドの呼び出しについて

    こんばんは。objective-Cについて教えてください。 クラス間でのメソッドの呼び出しについてです(果たしてこの言い方であってるのかも怪しいですが…) 例えば、 aクラスの実装ファイル -(void)setUpView {  self.checkButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain]; [self.checkoutButton setTitle:@"チェック" forState:UIControlStateNormal]; [self.completeCheckoutButton addTarget:self                 action:@selector(checkAction)         forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:self.checkButton]; } -(void)checkAction {   処理 } これで同じクラス内でのメソッドの呼び出しはできていると思いますが、 bクラスの実装ファイルに書いたメソッドを処理として追加したい場合はどう書いたらいいのでしょうか? 一通り調べたつもりですが、もし過去にも同じ質問がありましたら申し訳ありません。 もし説明が足りない場合は補足させていただきますので、どなたかよろしくお願いします。

  • objective-cで困っています教えてください

    objective-cをトライ&エラーで試しながら学習をしている初心者です。タッチした所を中心にまず100×100の正方形を表示し、その後スライダーで正方形の大きさを決めてから画像のトリミングをしたいのですが、正方形が表示されないのと、タッチした位置と切り取られる位置がずれています。上記の内容で行き詰っており、知恵をお借りしたいと思い投稿しました。宜しくお願いします。 ViewController.mの内容 #import "ViewController.h" @interface ViewController (){ // UILabel *label; // UIImageView *uv; //中心の位置 float v; // X座標 float x; // Y座標 float y; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. //写真の表示 CGRect rect_uv = CGRectMake(0,20, 360, 360); UIImageView *imageView = [[UIImageView alloc] initWithFrame:rect_uv]; //画像のアスペクト比を維持しUIImageViewサイズに収まるように表示 imageView.contentMode = UIViewContentModeScaleAspectFit; UIImage *image = [UIImage imageNamed:@"hoge.png"]; [imageView setImage:image]; [self.view addSubview:imageView]; // UISliderのインスタンス化 CGRect rect_sd = CGRectMake(50, 400, 200, 10); UISlider *slider = [[UISlider alloc]initWithFrame:rect_sd]; // スライダーの最小値,最大値,値を設定 slider.minimumValue = 0; slider.maximumValue = 500; slider.value = 100; // スライドしている最中に値を調べられるようにする.デフォルトでYESだがサンプルのため slider.continuous = YES; // スライダーの値が変更されたときに呼ばれるメソッドを設定 [slider addTarget:self action:@selector(slider_ValueChanged:) forControlEvents:UIControlEventValueChanged]; // スライダーをビューに追加 [self.view addSubview:slider]; // ラベルの設置 CGRect rect_lb = CGRectMake(300, 400, 100, 30); label = [[UILabel alloc]initWithFrame:rect_lb]; [self.view addSubview:label]; // 標準ボタン例文 UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect]; btn.frame = CGRectMake(50, 450, 100, 30); [btn setTitle:@"切り取り" forState:UIControlStateNormal]; [btn addTarget:self action:@selector(trim:) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:btn]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } /** * スライダーの値が変更されたとき */ - (void)slider_ValueChanged:(id)sender { UISlider *slider = sender; // スライダーの値をログに記述 NSLog(@"スライダーの値:%f", slider.value); // ラベルのテキストを設定 //float v = slider.value; v = slider.value; label.text = [NSString stringWithFormat:@"%2.f",v]; //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,v,v)); // 四角形の描画 } /** * タッチされたとき */ - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { // 1.anyObjectメソッドでいずれか1つのタッチを取得 // 2.locationViewメソッドで対象となるビューのタッチした座標を取得 CGPoint p = [[touches anyObject] locationInView:self.view]; x = p.x; // X座標 y = p.y; // Y座標 NSLog(@"タップ開始 %f, %f", x, y); //四角形を描画 CGContextRef context = UIGraphicsGetCurrentContext(); // コンテキストを取得 CGContextStrokeRect(context, CGRectMake(x,y,100,100)); // 四角形の描画 } /** * 切り取りボタンが押されたとき呼ばれるtrimメソッド */ -(void)trim:(UIButton*)button{ // ここに何かの処理を記述する // (引数の button には呼び出し元のUIButtonオブジェクトが引き渡されてきます) // 切り抜き元となる画像を用意する。 //UIImage *srcImage = /* UIImagePickerなどから取得したUIImage */ UIImage *srcImage = [UIImage imageNamed:@"hoge.png"]; // 切り抜く位置を指定するCGRectを作成する。 CGRect trimArea = CGRectMake(x, y, v, v); // CoreGraphicsの機能を用いて、 // 切り抜いた画像を作成する。 CGImageRef srcImageRef = [srcImage CGImage]; CGImageRef trimmedImageRef = CGImageCreateWithImageInRect(srcImageRef, trimArea); UIImage *trimmedImage = [UIImage imageWithCGImage:trimmedImageRef]; // 画像表示例文 //UIImage *img = [UIImage imageNamed:@"hoge.png"]; UIImageView *iv = [[UIImageView alloc] initWithImage:trimmedImage]; [self.view addSubview:iv]; } @end

  • iPhoneアプリプログラミング

    iPhoneアプリ開発超初心者です。 「逆引きObjective-C for iPhoneアプリ」というサイトの中の http://www.objectivec-iphone.com/UIKit/UIImageView/UIImageView.html に、画像を表示するサンプルプログラムとして - (void)viewDidLoad { [super viewDidLoad]; // UIImageViewの初期化 CGRect rect = CGRectMake(10, 10, 250, 250); UIImageView *imageView = [[UIImageView alloc]initWithFrame:rect]; // 画像の読み込み imageView.image = [UIImage imageNamed:@"lena.png"]; // UIImageViewのインスタンスをビューに追加 [self.view addSubview:imageView]; } が紹介されているのですが、 メソッド - (IBAction)executeView:(id) sender {   // 画像表示 } の中で、画面上の特定位置への画像表示を指定する方法を教えてください。 上記のサンプルプログラムとメソッドを組み合わせるようなことをするのでしょうか? なにぶん超初心者で的外れなことを言っているかもしれませんが、よろしくお願いします。

  • iPhoneアプリプログラミングButton

    現在iPhoneアプリのプログラミングを勉強を兼ねてカレンダーを作っています。 ボタンを押した時、月を移動するプログラムを組むところで処理がうまくいかず困っています。 まず、年月日曜日を取得するとき、int型でyear,monthを宣言し,現在の日付データを入れています。 その値をボタンを押した時に増減させたいのですが、以下の//エラーが出る箇所と記載した場所でviewcontroller not found とエラーが出てしまいます。 ボタンの中のコードから、viewDidLoad内の変数の値を変えるにはどうしたらいいのでしょうか? 「//年・月・日・曜日の取得」と「//月を移動するButton」のコードはviewDidLoad内にコードを書いています。 //年・月・日・曜日の取得 NSDate *now = [NSDate date]; NSCalendar *calendar = [NSCalendar currentCalendar]; NSUInteger flags; NSDateComponents *comps; flags = NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit; comps = [calendar components:flags fromDate:now]; NSInteger year = comps.year; NSInteger month = comps.month; NSInteger day = comps.day; comps = [calendar components:NSWeekdayCalendarUnit fromDate:now]; NSInteger weekday = comps.weekday;//1日が日曜、7日が土曜 NSInteger firstDayWeek = [self getFirstWeek:year month:month];//月の初日の曜日 //月を移動するButton UIButton *preButton = [UIButton buttonWithType:UIButtonTypeCustom]; [preButton setTitle:@"前月" forState:UIControlStateNormal]; preButton.titleLabel.font = [UIFont boldSystemFontOfSize:10]; preButton.tintColor = [UIColor whiteColor]; preButton.backgroundColor = [UIColor blueColor]; preButton.frame = CGRectMake(10, 30, 30, 20); [preButton addTarget:self action:@selector(preview:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:preButton]; //前月を表示するボタンメソッドの内容 - (void) preview:(id *)sender{ if (_year==1) { //エラーが出る箇所 self.month = 12  //エラーが出る箇所 _month--; //エラーが出る箇所 }else self.month--; //エラーが出る箇所 }

  • xcode 画像をランダムに並べ順番に押す

    初めてですが質問よろしくお願いします。 iphone開発初心者です。 数字の画像をランダムに5×5に並べ、1から25まで順番に押していく、 というアプリを制作中なのですが行き詰まっています。 現在下記コードのようになっています。 画像を表示まではできたのですが、下記3つ、できればソースコードをお聞きしたいです。 (1)画像25個をランダムに表示する記述がわかりません (今はとりあえずで同じ画像を1つ入れてます。(img1~img25のimg1を代入中)) (2)順番に押していく処理 (3)画像を押された時に音を出したい - (IBAction)image:(id)sender { AudioServicesPlaySystemSound(sound_1); } の部分をうまく入れこめばいいのかと思っていますが、その入れこみ方もわかりません。 AudioToolboxは追加済みです。 どなたかご教授よろしくお願いします。 #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSString *path = [[NSBundle mainBundle] pathForResource:@"btn_1" ofType:@"mp3"]; NSURL *url = [NSURL fileURLWithPath:path]; AudioServicesCreateSystemSoundID((CFURLRef)CFBridgingRetain(url), &sound_1); int yo = 5; for(int i = 0;i<yo; i++){ UIImageView *imageView = [UIImageView new]; imageView.frame = CGRectMake(15+60*i, 100, 60, 60); imageView.image = [UIImage imageNamed:@"img1.png"]; [self.view addSubview:imageView]; } int f = 25; for(int i = 0;i<f; i++){ UIImageView *imageView = [UIImageView new]; imageView.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60); imageView.image = [UIImage imageNamed:@"img1.png"]; [self.view addSubview:imageView]; } int rand = arc4random()%f; for(int i = 0; i<f; i++){ if(i == rand){ UIButton*button = [UIButton new]; button.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60); [button setImage:[UIImage imageNamed:@"img1.png"] forState:UIControlStateNormal]; [button addTarget:self action:@selector(buttonTapped) forControlEvents:UIControlEventTouchDown]; [self.view addSubview:button]; }else{ UIImageView *imageView = [UIImageView new]; imageView.frame = CGRectMake(15+60*(i%5), 100+60*(i/5), 60, 60); imageView.image = [UIImage imageNamed:@"img1.png"]; [self.view addSubview:imageView]; } } } - (IBAction)image:(id)sender { AudioServicesPlaySystemSound(sound_1); } -(void)buttonTapped{ } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end

専門家に質問してみよう