カスタムビューを重ねて、閉じる

このQ&Aのポイント
  • Objective-Cで開発を行っている者です。ViewControllerにTableViewを乗せ、そこにUIButtonを乗せたカスタムセルを乗せて、ボタンを押すとカスタムUIViewをaddViewする、というアプリを作りました。
  • 後半のカスタムUIViewを出すところは、こちらのページを参考にさせていただきました。http://montan.hateblo.jp/entry/2012/08/21/223335
  • また、カスタムUIViewにもボタンを置き、それを押すと[self removeFromSuperview];で閉じるようにしました。ビルドすると、カスタムセルのボタンを押してUIViewを出し、さらにそこのボタンを押してUIViewを閉じるところまでは問題なく動きました。しかしもう一度セルのボタンを押すと、unrecognized selector sent to instance エラーが出てしまいます。原因として考えられることはなにがあるでしょうか。
回答を見る
  • ベストアンサー

カスタムビューを重ねて、閉じる

Objective-Cで開発を行っている者です。 ViewControllerにTableViewを乗せ、そこにUIButtonを乗せたカスタムセルを乗せて、ボタンを押すとカスタムUIViewをaddViewする、というアプリを作りました。 後半のカスタムUIViewを出すところは、こちらのページを参考にさせていただきました。http://montan.hateblo.jp/entry/2012/08/21/223335 また、カスタムUIViewにもボタンを置き、それを押すと[self removeFromSuperview];で閉じるようにしました。 ビルドすると、カスタムセルのボタンを押してUIViewを出し、さらにそこのボタンを押してUIViewを閉じるところまでは問題なく動きました。 しかしもう一度セルのボタンを押すと、unrecognized selector sent to instance エラーが出てしまいます。 原因として考えられることはなにがあるでしょうか。 どうかよろしくお願い致します。

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

  • ベストアンサー
回答No.5

No.1,4です。 > 今回の問題を解決するために極力シンプルなプロジェクトをつくっていじっているので、 >見ていただいたコード以外にはCustomViewクラスがあるのみです。 > その中にも、指摘していただいたような箇所は見当たりませんでした・・・。 storyBoardやxibファイル内の各部品のイベント定義で 何か誤ってaddViewメソッドを設定しているようなこともなかったですか? > 少し自分でも混乱してきたので、一度整理してからもう一度チャレンジしてみたいと思います。 私がやったように、1から新規プロジェクトを生成して、動作するか確認してみると よいと思います。それが動けば、エラーが出る方と何が違うか比較して問題点を見つけることが できるはずです。 参考に、私が1から作った手順を示します。 (極力シンプルにするため、No.4回答でコメントした通りpushBtnメソッドは作らず ViewController内でaddtargetします。また、No.2お礼でaddSubViewをNSLogに 変えても問題が発生するとのことでしたので、CustomViewも作らずNSLogで ログ出力するだけのものを示します。) 1.Single View Applicationで新しいプロジェクトを作成する。 2.新規ファイル作成メニューで、CustomCellクラス(.h/.m/.xibファイル)を作成する。 設定項目は以下の通り。 「Class」 : CustomCell 「Subclass of」 : UITableViewCell 「Also create XIB file」 : チェックON 3.CustomCell.xibのセル(Content View内)にUIButtonを1個貼付ける。 4.UIButtonのReferencing OutletsをCustomCell.hに接続し、プロパティ名をmyButtonとする。 5.StoryBoardのViewController(View内)にUITableViewを貼付ける。 6.ViewController.hを以下の通りとする。 ------------------------------------------- #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> @property (weak, nonatomic) IBOutlet UITableView *tableView; @end ------------------------------------------- 7.StoryBoardのUITableViewのReferencing OutletsをViewController.hのtableViewプロパティに接続する。 8.ViewController.mを以下の通りとする。 ------------------------------------------- #import "ViewController.h" #import "CustomCell.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; _tableView.dataSource = self; _tableView.delegate = self; [_tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"Cell"]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; [cell.myButton addTarget:self action:@selector(addView:) forControlEvents:UIControlEventTouchUpInside]; return cell; } -(void)addView:(id)sender{ NSLog(@"addView"); } @end ------------------------------------------- これで実行するとボタンを押すたびにログに「addView」が表示されます。 2回目のタップでエラーが発生するようなことはありません。 これがうまくいくことを確認してからCustomViewを追加すればよいと思います。

katsuo777
質問者

お礼

またお礼が遅れてしまい申し訳ありません。 ご指摘のようにもう一度最初から作り直したところ、うまく動きました! 本当にありがとうございます! 結局、なにが原因でエラーが出ていたのかはわからず終いでしたが・・・ともあれ、これからもうまくいくはずなのに出来ないときには一からやり直してみる、というのをやってみようと思います。 改めてありがとうございました。

その他の回答 (4)

回答No.4

No.1です。 No.2お礼にあったコードをそのままコピペして、 足りないところを補って新規プロジェクトを作ったところ、 問題なくカスタムViewの表示と削除を何度も繰り返すことが できました。 なので、ここに書いてある部分以外の問題だろうと思います。 エラーメッセージより、本来ViewControllerのaddViewを 呼び出すはずが、UIButtonのaddViewを呼び出そう としてエラーになっています。 これはつまり、addTargetする時の指定オブジェクトに ViewControllerではなくUIButtonのオブジェクトを 指定している場合があるということになります。 あるいは、storyboardやxibの中で定義したUIButtonの イベントにaddViewメソッドを登録しているものが あるのかもしれません。 開示されたコードでは、CustomCellのpushBtnの中で addTargetしており、その呼び出しはViewControllerの cellForRowAtIndexPathからしか呼び出されていませんが、 実際のコードで、それ以外にaddTargetしたりpushBtnを 呼び出したりしているところはないでしょうか? あるいは、開示されたコードでは、cellForRowAtIndexPath の中で必ずpushBtnを呼び出すようになっていますが、 おそらく実際のコードはこの通りではなくいろいろな処理を しているのだと思います。その処理の中で条件によっては pushBtnが呼ばれないようなケースがないでしょうか? そのあたりを確認してみるとよいと思います。 あと、今回の問題の原因と直接関係ないとは思いますが、 カスタムセル内のボタンのイベントを拾うのに無駄に 複雑なことをしすぎです。 質問に書かれてあったサイトを参考にして、カスタムセルの クラス内にaddTargetするメソッド(pushBtn)を作り、 それをcellForRowAtIndexPathから呼び出していますが、 そんなことをしなくても、cellForRowAtIndexPathの中で [cell.myButton addTarget:self action:@selector(addView:) forControlEvents:UIControlEventTouchUpInside]; と書くだけでいいです。 pushBtnメソッドは不要です。つまりカスタムセル内は 新たなメソッドを作る必要ありません。 あなたが参考にされたサイトは、その冒頭に 「エンジニアのたまごです」 と書かれている通り、初心者が書かれているものです。 おそらくcell.myButtonでボタンにアクセスできることに 気付かずに回り道をしたのだと思います。 もちろん、カスタムセル内に一定の機能を持たせ、 その機能の一環でボタンのイベントを自動登録するというケースも あるのですが、pushBtnとかbtnPushedといったメソッド名では そのような意図は感じられず、さらにボタンイベントの登録を する処理ではなくボタンが押された時に呼ばれるメソッドのような 印象を与える名前で、とても悪いネーミングだと思います。 このようなネーミング一つでとてもわかりにくいコーディングに なります。No.3さんにスパゲティコードだと言われても仕方のない ところだと思います。

katsuo777
質問者

お礼

お礼が遅くなり大変申し訳ありません。 色々なご指摘をしていただきましてありがとうございます。 >実際のコードで、それ以外にaddTargetしたりpushBtnを 呼び出したりしているところはないでしょうか? >その処理の中で条件によっては pushBtnが呼ばれないようなケースがないでしょうか? 今回の問題を解決するために極力シンプルなプロジェクトをつくっていじっているので、見ていただいたコード以外にはCustomViewクラスがあるのみです。 その中にも、指摘していただいたような箇所は見当たりませんでした・・・。 少し自分でも混乱してきたので、一度整理してからもう一度チャレンジしてみたいと思います。 メソッドのネーミングについては今まで自分がわかればそれでいいというようにやってきたので、改めたいと思います。

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

回答No.2への「お礼」に対して: プログラムコードを見せろといったのは、たしかにこちらのほうですが、正直そんなことをいって後悔しています。みごとな「スパゲティコード」です。ただそれでも勉強させてもらったのは、たった1本のスパゲティでも、もつれさせることは可能だという事実です。 もつれたスパゲティをほぐす気は、はっきりいって私にはありません。その代わり、ちょっとはましな、(おそらく)おなじことをするコードを載せておきます。あなたの勉強の足しになれば、幸いです。 ※「@」が文中に含まれると、OKWaveはセキュリティに問題ありと判断するようなので、すべて全角に置き換えてあります。 ViewController.h -------- #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate> @property (weak, nonatomic) IBOutlet UIButton *hideButton; // Storyboardで配置。テーブルセル上のボタンを押すと、表示され、このボタンを押すと、自身を非表示にします。 @end ViewController.m --------- #import "ViewController.h" #import "MyTableViewCell.h" #define CELL @"Cell" @interface ViewController () @property (weak, nonatomic) IBOutlet UITableView *tableView; - (IBAction)hideMe:(id)sender; // hideButtonに組みこんだアクションメソッド @end @implementation ViewController { NSMutableArray *data; } - (void)viewDidLoad { [super viewDidLoad]; [self.tableView registerClass: [MyTableViewCell class] forCellReuseIdentifier: CELL]; data = [NSMutableArray arrayWithObjects: @"Angel", @"Brutus", @"Curry", @"Design", @"Empty", @"Friday", @"Gregory", nil]; } #pragma mark Table View Delegate and DataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return data.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: CELL forIndexPath: indexPath]; cell.myLabel.text = data[indexPath.row]; cell.viewController = self; // MyTableViewCellのプロパティ「viewControllerに、自身を渡す。 return cell; } - (IBAction)hideMe:(UIButton *)sender { // 引数の型idをUIButton *に変更してあります。 sender.hidden = YES; // sender(hideButton)を非表示にする。 } @end MyTableViewCell.h -------- #import <UIKit/UIKit.h> #import "ViewController.h" @interface MyTableViewCell : UITableViewCell @property (nonatomic) UILabel *myLabel; @property (nonatomic) ViewController *viewController; // hideButtonのあるView Controller @end MyTableViewCell.m --------- #import "MyTableViewCell.h" @interface MyTableViewCell () // クラスエクステンションというやつ。 @property (nonatomic) UIButton *leftButton; // hideButtonを表示するボタン。 @end @implementation MyTableViewCell - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { // leftButtonの初期化 self.leftButton = [UIButton buttonWithType: UIButtonTypeSystem]; [self.leftButton setTitle: @"Show" forState: UIControlStateNormal]; self.leftButton.frame = CGRectMake(20.0, 8.0, 80.0, 24.0); [self.leftButton addTarget: self action: @selector(showButton:) forControlEvents: UIControlEventTouchUpInside]; [self.contentView addSubview: self.leftButton]; self.myLabel = [[UILabel alloc] initWithFrame: CGRectMake(120.0, 8.0, 160.0, 24.0)]; self.myLabel.text = @"label"; [self.contentView addSubview: self.myLabel]; } return self; } // leftButtonに組みこむアクションメソッド - (void)showButton: (id)sender { if (self.viewController != nil) { self.viewController.hideButton.hidden = NO; } } @end

katsuo777
質問者

お礼

お礼が遅くなりまして大変申し訳ありません。 ご親切にサンプルコードを載せていただき、ありがとうございます。 まだ解決までは至っておりませんが、こちらを参考にして解決を目指したいと思います。 コードの汚さについては、自分が今までネット上の知識を中心に「とりあえず動くものを」といった姿勢でアプリを作ってきたことが原因かと思います。 今後、わかりやすいコードを書くことも意識して取り組んで行きたいと思います。

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

> 原因として考えられることはなにがあるでしょうか。 原因の数は、星の数ほどあります。それを知っているだけ並べ立てろと、回答者に要求するなら、それはあなた、驕りすぎです。 あなたが書いたプログラムコードを提示して、「どこがおかしいですか?」とお尋ねになるのなら、回答者は、それなりにピンポイントで指摘することができるでしょう。 直接の原因でなく、方向性として間違っているからという、間接の原因なら、ボタンをaddSubview(addViewではない)、removeFromSuperviewをくり返すという、無意味なオブジェクトの生成と解放にあります。 あなたはただボタンを「置く」、「閉じる」という軽い感覚でそういう処理をしているようですが、コンピュータ(この場合は、iPhone/iPad)にとってみると、相応に重い処理です。とくにそれ自体頻繁に生成と解放をくり返すUITabelViewCell上のオブジェクトであるなら、なおさらです。 UIViewのプロパティ「hidden」で、非表示にする、表示するという繰り返しなら、オブジェクトの生成と解放を行っているわけではないので、コンピュータ側の負担は小さいはずです。それと、「宣言されていないセレクタ」なるもを呼ぶことも防げるでしょう。

katsuo777
質問者

お礼

ご回答ありがとうございます。 ご指摘の通り、質問の仕方があいまいで、また必要な情報もお見せしていませんでした。申し訳ありませんでした。 その上で図々しいかと思いますが、コードを載せますので解決のヒントをいただけないでしょうか。 どうかよろしくお願い致します。 //TableViewをセットしたViewController.m - (void)viewDidLoad { [super viewDidLoad]; _tableView.dataSource = self; _tableView.delegate = self; [_tableView registerNib:[UINib nibWithNibName:@"CustomCell" bundle:nil] forCellReuseIdentifier:@"Cell"]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; [cell pushBtn:self]; return cell; } -(void)addView:(id)sender{ CustomView *customView = [[CustomView alloc] init]; [self.view addSubview:customView]; } //TableViewに登録したCustomCell.m - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { } return self; } - (void)awakeFromNib { } - (void)setSelected:(BOOL)selected animated:(BOOL)animated { [super setSelected:selected animated:animated]; } - (void)pushBtn:(id)mainView { [_myButton addTarget:mainView action:@selector(addView:) forControlEvents:UIControlEventTouchUpInside]; } No.1の方のご助言から、カスタムセルのボタンを2回目に押した際にaddViewが見つからない、ということはわかりました。 (エラーメッセージ:[UIButton addView:]: unrecognized selector sent to instance 0x8f6a910) しかし、なぜ1回目は動くのに2回目だとエラーが出るのか、またその修正の仕方がわかりません・・・。 色々といじってみましたが、addView内の内容は関係ないようでした。 (addSubviewを、教えていただいたhiddenや、単純なNSLog等に置き換えてみても同様のエラーが起きました。)

回答No.1

> unrecognized selector sent to instance エラーが出てしまいます。 このメッセージの直前(同じ行)に、どのクラスの 何と言うメソッドを呼び出そうとして失敗したのかが 書かれてあるはずです。呼び出そうとしたクラスに 指定メソッドが無いということです。 たいてい、思っていたものと別のクラスに対して メソッドを呼び出そうとしたケースが多いと思います。 設計ミスやコーディングミスでよくあるエラーです。 エラーメッセージ内容をちゃんと全部書いてないので、 それ以上はわかりません。 丁度、 http://www.raywenderlich.com/ja/50797/%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8C%E3%82%AF%E3%83%A9%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%A1%E3%82%83%E3%81%A3%E3%81%9F%E3%80%82%E3%81%95%E3%81%A6%E3%80%81%E3%81%A9%E3%81%86%E3%81%97%E3%81%BE に、unrecognized selector sent to instance が発生した時に どのようにデバッグすればいいか、初心者向けにとても丁寧に 解説されている記事がありましたので、前半だけでもしっかり読んでみる ことをお勧めします。

katsuo777
質問者

お礼

いつも詳しくありがとうございます。 教えていただいたページを読んでエラーの原因を探ったところ、カスタムセルにセットしたボタンを押した際に呼び出すはずのメソッドが見つからない、というところまではわかりました。 最初に押した時にはきちんと動くのに、2回目だとなぜエラーが出るのか、まだわかりませんが、、、ともかく少し解決に近づけました。 ありがとうございます。

関連するQ&A

  • 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のドキュメントを探したんですが、 思ったような情報が見つからず相当はまってます。 ネットで探して見つからないってことは、凄く初歩的なことか?? と思ってるんですが、、、 どなたか、助けていただけたらありがたいです。

  • iPhoneアプリ 画面遷移での変数受け渡し

    現在、iPhoneアプリの開発を勉強している者です。 少し詰まってしまった箇所があるので、ご教授いただけると幸いです。 TableViewController間での変数の受け渡しを実装しており、1枚目のTableViewでタップされたセルのテキストを2枚目に渡す、というコードを書きました。 受け渡しに関するコードは以下の部分です。 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [self performSegueWithIdentifier:@"mySegue" sender:self]; } -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([[segue identifier] isEqualToString:@"mySegue"]) { SecondTableViewController *viewCon = segue.destinationViewController; NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; viewCon.myValue = cell.textLabel.text; } } これ自体は問題なく動いてくれたのですが、SecondTableViewControllerにNavigationControllerをEmbed Inしたところ、1枚目でセルをタップした際にエラーが出てアプリが止まってしまうようになりました。 BreakPointを設けてみると上記コードのviewCon.myValue = cell.textLabel.text;のところで止まっており、unrecognized selector sent to instanceというエラーが吐き出されていました。 同様のエラーが出た例などを調べてみたのですが自力では解決できず・・・、どなたか原因を指摘して頂けるとありがたいです。 よろしくお願いします。

  • objective-c 画面遷移について

    プログラミングに関して素人です。 UIViewControllerからPushコードを使って別のUIViewに画面遷移したいのですが 遷移先にTableViewを2つ並べております。 画面遷移する際のコードはどのように記述したらいいのでしょうか? 詳しいかたお力お貸しいただければと思います。 ViewController.m - (IBAction)NewsPage:(UIButton *)sender { //こちらの記述方法が不明 } TViewController.h // XibファイルとUIViewの紐づけ。 @property (weak, nonatomic) IBOutlet UITableView *leftTableView; @property (weak, nonatomic) IBOutlet UITableView *rightTableView; - (IBAction)TopButton:(UIButton *)sender; 根本的になにか違えばご指摘お願いします。

  • 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を消す等の方法や考え方などご教授お願いします。

  • Objective-C ボタンを動かすには

    Objective-Cはまったくの初心者で、iPhone用のアプリを作るのに書籍を見ながらサンプルをいじっています。 画像をタップしたらその画像自体が動くようなものを作りたいのですが、 RoundRectButtonを1個だけ配置して 【imageTestViewContollorer.h】 @interface imageTest1ViewController : UIViewController { IBOutlet UIButton *myButton; } -(IBAction)tapBtn; @end 【imageTestViewContollorer.m】 @implementation imageTestViewController -(IBAction)tapBtn{ myButton.center=CGPointMake(50,50); [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:2]; myButton.center=CGPointMake(160, 240); [UIView commitAnimations]; } としてみましたが、コンパイルエラーなどはありませんでしたが、ボタンを押しても何も起こりませんでした。 IBOutlet UIButtonが臭いような気もしているのですが、UIImageViewにするとRoundRectButtonと線を繋げなくなりますし、どう直してよいか見当もつかず困っています。 画像がタップされたら動く、みたいなものをそもそもRoundRectButtonに画像を割り当てた方がいいのかImageViewにタップされた場合の処理を割り当てた方がいいのかどうかもよくわかりません。 よろしくお願いいたします。

  • setAnimationDidStopSelectorについて教えてく

    setAnimationDidStopSelectorについて教えてください(iPhone SDK) 以下のようなコードを組んでいるのですが、setAnimationDidStopSelectorで指定したendDropPartメソッドの中で、どうやってアニメーションさせるオブジェクトを指定するか悩んでいます。iPhone SDKは初心者です。どなたかご教授いただけないでしょうか? -(void)endDropPart{ /* [下のメソッドのrrecieverが指すボタン setAlpha:1.0f]; */ NSLog(@"endAnim"); } - (void)DropPart:(UIButton *)reciever { [player play]; CGFloat y = [reciever center].y; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.5f]; [UIView setAnimationDelegate:self]; [UIView setAnimationDidStopSelector:@selector(endDropPart)]; [reciever setCenter:CGPointMake([reciever center].x, y+150)]; [reciever setAlpha:0.0f]; [UIView commitAnimations]; }

  • Xcodeの開発でエラーの解決したいです

    Xcodeでの開発で、エラーの解決できなくて困りました。 最初のViewからCoreDataを使ったTableViewへ遷移する際に落ちます。 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController; UINavigationController *navigationController = [splitViewController.viewControllers lastObject]; splitViewController.delegate = (id)navigationController.topViewController; UINavigationController *masterNavigationController = [splitViewController.viewControllers objectAtIndex:0]; MasterViewController *controller = (MasterViewController *)masterNavigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; } else { UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; MasterViewController *controller = (MasterViewController *)navigationController.topViewController; controller.managedObjectContext = self.managedObjectContext; } return YES; 上記のコードで落ちてるのですが、どうすればいいか分からないので困りました。 勉強不足で、すみません。 どのように対処すればよいか、ご教授お願いします。 ビルドして最初の画面でボタンを押して、テーブル・ビューへの遷移時に落ちて以下のエラーが表示されます。 [UINavigationController setManagedObjectContext:]: unrecognized selector sent to instance どうしても解決したいので、よろしくお願いします。

  • [iPhoneアプリ開発]継承クラスを作らず

    Objective-cでiPhoneアプリを作っています 自前でクラスを作らず(.hファイルと.mファイルを作らず)別のファイルで基本的なクラスのインスタンスを作ってその場で設定したいんですが、どうすればいいでしょうか。 例えば、ある画面のコード(ViewController.mにします)で UITableViewController *foo = [[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]; (TableViewを表示させたい) と書き、その画面(ViewController)内のボタンやラベルを押せばfooに遷移できるようにします。 すると、確かに遷移はできるのですが何も無いページが表示されるだけです。 TableViewなので設定(セクションのタイトルだとかセルの数だとかを決める)をしなければ何も表示されないのは当たり前ですよね。 この設定をViewController.m内で行いたいのです。 いつもならUITableViewControllerを継承したクラスを作りそこで設定を行なっていました。 今回はそれを作りたいくない、というわけです。 できますでしょうか。 ちなみに遷移に関してですが、NavigationControllerを想定しています。 よろしくお願いします。

  • 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クラスの実装ファイルに書いたメソッドを処理として追加したい場合はどう書いたらいいのでしょうか? 一通り調べたつもりですが、もし過去にも同じ質問がありましたら申し訳ありません。 もし説明が足りない場合は補足させていただきますので、どなたかよろしくお願いします。

  • iPhoneアプリ とある質問です。

    NSTimerの中のUIViewアニメーションが動きません。 NSTimerの中のアラームは動いているので、NSTimerは動いていると思うのですが。。。 3週間、思いつく限り色々と試したり、参考書見たり、ネットで調べたりしたのですが、お手上げです。 ヒントでもかまいませんので、アドバイスを頂けたら幸いです。 まず状況としては、 h.ファイルで、アニメーションで動かしたい、IBOutlet UIButton *mを宣言してあります。 次に、UISwitchのON,OFFでNSTimerが起動します。 musicClock = [NSTimer scheduledTimerWithTimeInterval:0.4 target:self selector:@selector(test:) userInfo:nil repeats:YES]; そして、NSTimerの中で、以下のようにプログラムしてあります。 条件にあてはまれば、音楽とアニメーションが画面上で動くことを意図しています。 -(void)test:(NSTimer*)timer{ musicDate = [datePicker date]; NSTimeInterval t = [musicDate timeIntervalSinceNow]; NSLog(@"NSTimeInterval:%f",t); //アラームの処理 if (t <=0.0 && t > -600.0){ if (!musicAlarm.playing) //アニメーションの定義開始 [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.4]; [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; int x = rand() % 320; int y = rand() % 480; m.center = CGPointMake(x, y); [musicAlarm play]; [UIView commitAnimations];