- ベストアンサー
Objective-Cでサブビューからスーパービューにメッセージを送る方法
- Objective-Cにおけるプログラミングで、あるビュー(スーパービュー)に対してaddSubViewされている別のビュー(サブビュー)から、メッセージを送る方法について質問します。
- スーパービュー側からサブビューに対してメッセージを送る場合は、サブビューをインスタンス変数として定義し、参照することができます。しかし、サブビューからスーパービューに対してメッセージを送る場合は、新たにスーパービューの属するクラスのインスタンスを作成して、そこからメッセージを送る必要があります。
- サブビューからスーパービューにメッセージを送る際には、サブビューが属するスーパービューとは異なるインスタンスに送ることになりますので、注意が必要です。メッセージの送り方について詳しく説明してください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
superviewとか。 詳しくは、NSView/UIViewのリファレンスをご覧ください。 ただ、ビュー同士でプログラマの指示により直接的なメッセージをやり取りしなければいけないというのは、MVCのデザインにほころびが発生している証拠かもしれません(AppKit/UIKitなら、レスポンダチェーンやターゲット・アクション機構などで、コントローラ側に実装するのが一般的)。なので、本当にそうする必要があるのか、よく考えてみたほうがよいかも。
その他の回答 (3)
- osamuy
- ベストアンサー率42% (1231/2878)
タップ時イベントメッセージにsenderとして引き渡されているのでは。
お礼
デリゲーションという仕組みで解決できました! ありがとうございました。
補足
(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)
> この場合に、サブビュー側からTableViewControllerにメッセージを送る方法がよくわかりません。 Interface Builderで、線を引っ張って、結びつければいいのでは? ところで、「メッセージの」送り元が、UIControlのサブクラスでないという、オチではありませんよね?
お礼
デリゲーションという仕組みで解決できました! ありがとうございました。
補足
サブビューは、プログラムの中で、複数生成されたり、削除されたりするものなので、 IBで結びつける事ができないように思います。
- harawo
- ベストアンサー率58% (3742/6450)
「self.superview」ないし「[self superview]」で呼び出すだけです。 > スーパービュー側からサブビューに対してメッセージを送る場合は、 > サブビューをインスタンス変数としてとして定義して、参照できると思いますが、サブビューからはそれができないと思います。 そう思い込んでしまったところで、つまずいてしまったのでしょうね。
お礼
ご回答ありがとうございます。 そうですね、スーパービューが参照できないというのは、おかしい話だったようですね。 問題がまだよく整理できていないようです。
補足
ご回答ありがとうございます。 そうですね。ご指摘の通りなのだと思います。 今、次のような状況で困っています。 TableViewCellのcontentViewにaddSubviewした2つのサブビューをタップした場合に、どちらのサブビューがタップされたのかということをTableViewControllerに伝えたいのです。 この場合に、サブビュー側からTableViewControllerにメッセージを送る方法がよくわかりません。