• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:サブビューからスーパービューにメッセージ送りたい)

Objective-Cでサブビューからスーパービューにメッセージを送る方法

このQ&Aのポイント
  • Objective-Cにおけるプログラミングで、あるビュー(スーパービュー)に対してaddSubViewされている別のビュー(サブビュー)から、メッセージを送る方法について質問します。
  • スーパービュー側からサブビューに対してメッセージを送る場合は、サブビューをインスタンス変数として定義し、参照することができます。しかし、サブビューからスーパービューに対してメッセージを送る場合は、新たにスーパービューの属するクラスのインスタンスを作成して、そこからメッセージを送る必要があります。
  • サブビューからスーパービューにメッセージを送る際には、サブビューが属するスーパービューとは異なるインスタンスに送ることになりますので、注意が必要です。メッセージの送り方について詳しく説明してください。

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

superviewとか。 詳しくは、NSView/UIViewのリファレンスをご覧ください。 ただ、ビュー同士でプログラマの指示により直接的なメッセージをやり取りしなければいけないというのは、MVCのデザインにほころびが発生している証拠かもしれません(AppKit/UIKitなら、レスポンダチェーンやターゲット・アクション機構などで、コントローラ側に実装するのが一般的)。なので、本当にそうする必要があるのか、よく考えてみたほうがよいかも。

modern2
質問者

補足

ご回答ありがとうございます。 そうですね。ご指摘の通りなのだと思います。 今、次のような状況で困っています。 TableViewCellのcontentViewにaddSubviewした2つのサブビューをタップした場合に、どちらのサブビューがタップされたのかということをTableViewControllerに伝えたいのです。 この場合に、サブビュー側からTableViewControllerにメッセージを送る方法がよくわかりません。

その他の回答 (3)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.4

タップ時イベントメッセージにsenderとして引き渡されているのでは。

modern2
質問者

お礼

デリゲーションという仕組みで解決できました! ありがとうございました。

modern2
質問者

補足

(1) iOSでのプログラミングであり、 サブビューの実装で、 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{ // ... [self.nextResponder touchesEnded:touches withEvent:event]; } として、TableViewController(スーパービュー)の tableView:didSelectRowAtIndexPath:indexPathメソッドに タッチイベントを渡してみています。 この時点で2つのサブビューのうちどちらからのタッチイベントなのかを、 伝えたいのですが・・・ (2) TableViewController(スーパービュー)にメソッド-(void)action:(id)senderなどをつくって、 senderを渡すとすると、 [self.superview.superview.superview.superview action:self] 等とすれば、渡せるかもしれません。 ただ、このようなプログラムは実際にありうるのでしょうか? また、レスポンダーチェーンを使って、 [self.nextResponder action:self]; とすると、 「メソッドが処理できない」という旨の警告がでます。 やはり、プログラムの構造が良くないのでしょうね。

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

> この場合に、サブビュー側からTableViewControllerにメッセージを送る方法がよくわかりません。 Interface Builderで、線を引っ張って、結びつければいいのでは? ところで、「メッセージの」送り元が、UIControlのサブクラスでないという、オチではありませんよね?

modern2
質問者

お礼

デリゲーションという仕組みで解決できました! ありがとうございました。

modern2
質問者

補足

サブビューは、プログラムの中で、複数生成されたり、削除されたりするものなので、 IBで結びつける事ができないように思います。

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

「self.superview」ないし「[self superview]」で呼び出すだけです。 > スーパービュー側からサブビューに対してメッセージを送る場合は、 > サブビューをインスタンス変数としてとして定義して、参照できると思いますが、サブビューからはそれができないと思います。 そう思い込んでしまったところで、つまずいてしまったのでしょうね。

modern2
質問者

お礼

ご回答ありがとうございます。 そうですね、スーパービューが参照できないというのは、おかしい話だったようですね。 問題がまだよく整理できていないようです。

関連するQ&A