0

タッチセンシティブなこれらすべてのサブビューがあります。サブビューからスーパービューにメッセージを送信して、ユーザーがそれを選択したことを伝えたいので、スーパービューはコントローラーの残りの部分と通信できます。

サブビューとコントローラー、サブビュー >> スーパービュー >> コントローラーの間で通信できません

おそらくこれを達成するためにUIResponderを使用しますか?

4

2 に答える 2

0

サブビューによっては、ターゲット/アクションメカニズムがこれに適している場合があります。UIControlからサブビューを取得できる場合は、サブビューにアクションメッセージをターゲット(通常はビューコントローラー)に送信させるのが特に簡単です。インターフェイスビルダーでビューをレイアウトし、ビューコントローラに接続することでターゲットとアクションを指定できます。何らかの理由でUIControlから派生できない場合は、ターゲット/アクションと同等のものを実装する必要があり、IBで同じサポートを利用することはできませんが、それでもかなり簡単です。

もう1つの可能性は、ビューコントローラにすべてのサブビューのタッチ処理を行わせることです。これは基本的に、あなたが提案したようにレスポンダーチェーンを利用していますが、タッチ処理レベルです。追跡するサブビューがたくさんある場合は理想的ではないかもしれませんが、それは実行可能です。

これを行う3番目の方法は、サブビューが選択されたときにサブビューに通知を投稿させることです。

現状では、UIResponderは、レスポンダーチェーンに沿って任意のメッセージを渡すためのメカニズムを提供していません。その機能を追加することが、特にサブビューからビューコントローラーにメッセージを送信するための最も洗練された方法であるかどうかはわかりません。ビューコントローラとサブビューの間には潜在的に多くの中間オブジェクトがあり、メッセージの送信先がすでにわかっている場合はチェーン全体を巻き込むのは間違っているようです。ただし、UIResponderを拡張して、レスポンダーチェーンを単なるイベント以上のコンジットにすることを検討するのは興味深いことです。UIResponderにカテゴリを追加できます。

@interface UIResponder (Messages)
- (void)sendMessage:(SEL)message withObject:(id)object;
@end;

@implementation UIResponder (Messages)
- (void)sendMessage:(SEL)message withObject:(id)object
{
    if ([self respondsToSelector:message]) {
        [self performSelector:message withObject:object];
    }
    else {
        [[self nextResponder] sendMessage:message withObject:object];
    }
}
@end

警告上記のコードは完全にテストされておらず、私がまだ考えていない理由から、お粗末な考えかもしれません。注意して続行してください。コンパイルエラーが発生する可能性があります。指を交差させます。うまくいくかどうか教えてください。うまくいかない場合は放っておいてください。

于 2011-03-24T01:06:08.080 に答える
0

なぜ使えないのです[self.superview sendMessage]か?

于 2011-03-24T01:30:46.170 に答える