• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Objective-c 画面遷移について)

Objective-c 画面遷移についての質問

このQ&Aのポイント
  • Objective-cでの画面遷移について詳しく教えてください。
  • UIScrollViewを使用してタッチイベントを取得し、画面遷移する方法を教えてください。
  • navigationControllerを使用して画面遷移させる際に表示されるエラーについて質問です。

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

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

あとから気づきましたが、UIScrollViewは、タッチイベントを受け取るので、そこでResponder Chainが止まってしまい、UIVieeControllerまで届きませんね。まあ、タッチイベントを受け取れないと、スクロールできないわけですから、あたりまえといえば、あたりまえですね。 こういうときは、UITouchの代わりに、UITapGestureRecognizerを使うといいでしょう。 以下、UIViewControllerのサブクラスに記述します。タッチイベントを受け取るViewを、仮にreceiveViewとします。遷移先のViewControllerのクラス名を、NewViewControllerとします。 - (void)viewDidLoad { [super viewDidLoad]; UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(didTapGesture:)]; [receiveView addGestureRecognizer: tapGesture]; [tapGesture release]; } - (void)didTapGesture: (UITapGestureRecognizer *)recognizer { NewViewController *page6ViewController = [[NewViewController alloc] initWithNibName: nil bundle: nil]; [self.navigationController pushViewController: newViewController animated: YES]; [newViewController release]; }

eTakasy
質問者

お礼

すみません、先ほどの補足回答が入れ違いになっていたようです。。 UITapGestureRecognizerを使って、無事、画面遷移できるようになりました! これには相当困っていたので本当に助かりました。 ありがとうございました。

その他の回答 (1)

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

まず、「Responder Chain」という機構を覚えてください。 画面をタップすることで、タッチイベントというイベントが発生します。イベントを受け取ってそれに反応して仕事するオブジェクトを、UIResponderクラスのオブジェクトといいます。UIViewは、UIResponderのサブクラスなので、すべてのUIViewは、タッチイベントを受け取ることができます。 UIViewクラスに、「touchesBegan:」などのメソッドを書いておくと、イベントに合わせて、そのメソッドが実行されます。しかし、イベントを受け取るメソッドが実装されていないと、イベント自体は、そこで終わらずに、UIViewのスーパービューに引き渡されます。スーパービューにもメソッドがなければ、さらに上のスーパービューに渡され、さらにUIViewControllerに渡され、UIWinodowに渡され、最後にUIApplicationに渡されます。このイベントが渡されていく流れのことを、Responder Chainと呼びます。 今回の件では、かならずしもイベントを受け取るメソッドを、「MyScrollview」に記述する必要はなく、むしろメソッド内で行う処理のことを考えると、UIViewControllerに記述するのが、合理的です。 (ところで、コントローラでないものに、controllerというインスタンス名を付けたり、スクロールビューでないものに、scrollviewというクラス名を付けたりすることは、やめにしませんか?じぶんでじぶんを混乱させているだけですよ?) UITouchのプロパティに、「view」がありますが、これがタッチイベントを直接受け取ったビューを指しています。 -(void)touchesBegan: (NSSet *)touches withEvent: (UIEvent*)event { UITouch *theTouch = [touches anyObject]; if ([theTouch.view isEqual: controller]) { SecondViewController *mvc = [[[SecondViewController alloc] initWithNibName:nil bundle:nil] autorelease]; [self.navigationController pushViewController:mvc animated:YES]; } } こう書くことで、controller(という名のビュー)をタップしたときのみ、反応をするようになります。

eTakasy
質問者

補足

ありがとうございます。(Responder Chainについて検索し、少し勉強してみました) 早速、UIViewControllerにご回答いただいたメソッドを入れてみましたが、動きません。 MyScrollview(UIview)にも何かメソッドを書かなくてはいけないのでしょうか? どのように記述すればよいか、これも教えて頂けると有り難いです。。 頼ってばかりで本当に申し訳ありません。。 (あと、名前の付け方には以後気をつけます)