0

基本的に、2 つのサブビューを持つビュー コントローラーがあります。これらのビューを接続したい。タッチ イベントは別のビューからのイベントをトリガーする必要があり、その逆も同様です。私は2つの解決策について考えました。

1-) ビュー コントローラーを介してビューにアクセスする

2-) 各ビューには別のビューへのポインタがあります

私はIOSの初心者であり、他の問題から読んだ限りでは、ビューからビューコントローラーにアクセスすることはお勧めできません。それで、あなたたちは私に何をするように提案しますか?

編集:

コーディングに関してはあまり進歩がありませんでしたが、私の最初の見解は次のとおりです。

@interface PaintView : UIView
-(id)initWithFrame:(CGRect)frame andController:(ViewController*)ctrl;

そして、私はタッチイベントを制御し、ビューコントローラーにアクセスします:

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     //[self.controller somethingThatAccessToOtherView]
}

2番目のビューはそのビューと非常に似ています。

4

3 に答える 3

1

最も単純で、最も汚く、推奨されない方法が必要な場合。2つのビューになんらかの一意のタグを付けます(たとえば、-20と-21などを使用します。したがって、ビューを作成するView Controllerで、次のようにします。

[v1 setTag:-20];
[v2 setTag:-21];

次に、たとえばv2から次のように実行できます。

[self.superview viewWithTag:-20];

v1への参照を取得します。ただし、これは同じスーパービューを想定しており、ビューの階層が変更されないことが確実でない限り、物事を行うための良い方法ではありません(私が話しているのは、他の誰も触れないように作成したウィジェットです。とにかくそれをうまく文書化しました)。

より良い方法は、デリゲートパターンを使用することです。ViewControllerは、各サブビューのデリゲートです。タッチすると、サブビューは次のようなメソッドを呼び出します

[delegate iwastouched:self];

デリゲートには次のようなメソッドがあります

-(void) iwastouched:(UIView *) someview {
     if(someview == v1){
         //view 1 was touched, do something to view two
     }
     if(someview == v2){
         //view 2 was touched, do something to view one
     } 
}

それを行う別の悪い方法は、通知を使用することです。地獄、これを行うには、好きなだけ多くの方法があります。いくつかはちょうどそれほど良くありません。

于 2013-01-07T06:28:38.800 に答える
1

デリゲート パターンを使用しないでください。
2 つのビューが相互に通信するため..「各ビューには別のビューへのポインターがある」と本質的に似ていますが、はるかに柔軟な方法で

ここにそのスレッドがあります

于 2013-01-07T06:24:11.717 に答える
0

これを行う代わりに、 のサブクラスでUIViewController2 つのメンバーを持つ必要があります。これらのメンバーは、各サブビューを表します。

ここで、 のサブクラス内にUIViewController、関心のある touch メソッドを追加します。このメソッド内で、タッチ イベントが生成されるビューを識別します。

それに応じて、イベントを他のビューに渡します。

サブクラスの iVar として UIViewController を持つべきではありませんUIView

于 2013-01-07T06:22:51.040 に答える