11

誰かが何時間も立ち往生しているので、これについて私を助けてくれることを願っています。

ある種の絵本を作ろうとしています。コンテナであるビューがあり、addsubviewを使用してそれにサブビューを追加します。

サブビューには、親ビューのメソッドをトリガーしたいスワイプジェスチャなどがあります。デリゲートをトリガーする方法を考えましたが、デリゲートに親ビューをトリガーさせることができません。私はそれを行うための10以上の異なる方法を読みましたが、どれも機能しません。

私は今、スーパービューが何であるかについて非常に混乱しています。問題を混乱させるために、デリゲートにはタブコントローラーがあり、親ビューはタブボタン1です。

私は試した

[self.view.superview method]
[self.superview method]

デリゲートで、self.tabcontroller.parentviewcontroller、selectedview、superview.superを試しました

更新:サブビューは、再利用可能なビューとして、親ビューから独立している必要があります。また、スーパービューはサブビューのあるビューだと思っていたので、親ビューをスーパービューに設定していません(私を殺さないでください)。だから多分私は親ビューをスーパービューに設定する必要がありますか?

4

5 に答える 5

23

このようなことを行う適切な方法は、プロトコルとデリゲートパターンを使用することです。

次のようなプロトコルを定義します

@protocol subViewDelegate
   -(void)somethingHappened:(id)sender;
@end

次に、そのプロトコルをスーパービューに実装します。

@interface superView:UIViewController<subViewDelegate> {
...
}
...
@end

このようにサブビューでデリゲートプロパティを定義します

@interface subView : UIView {
   id<subViewDelegate> delegate;
   ...
}
@propery (nonatomic, assign) id<subViewDelegate> delegate;
...
@end

サブビューで、このように代理人に電話します

[self.delegate somethingHappened :self];
于 2010-09-22T15:24:25.517 に答える
3

コードが与えられていないとあなたを助けるのは少し難しいですが、試してみましょう:

  1. プロトコルを作成します。好きな名前を付け(「MyProtocol」と呼びます)、スーパービューで呼び出したい関数の定義を追加します。「respondToSwipe」と呼びましょう。
  2. スーパービューがUIViewの場合は、UIViewの独自のサブクラスを作成し、スーパービューをそのクラスのインスタンスにする必要があります。
  3. (新しく)作成したsuperviewクラスに1のプロトコルを実装させます。)「respondToSwipe」メソッドを実装します。
  4. サブビューにタイプidのインスタンス変数を作成し、「myDelegate」などの好きな名前を付けます。
  5. 2/3で作成されたスーパービューを「myDelegate」変数に渡します。
  6. いつでも[myDelegaterespondToSwipe]に電話してください
于 2010-09-22T15:23:40.650 に答える
0

カスタムビューの場合、UIControlをサブクラス化し、コントロールイベントを使用できます。

  • いくつかの制御イベントを定義します。4つのコントロールイベントを自由に作成できます(UIControlEventApplicationReserved = 0x0F000000
  • イベントを受信したい人に、addTarget:action:forControlEvents:を呼び出してもらいます。
  • コントロールコールを持っている[self sendActionsForControlEvents:events]

または、UIGestureRecognizerスタイルのインターフェイス(addTarget:action:)を使用することもできます。

または、UIGestureRecognizer(OS 3.2以降)を使用してください

于 2010-09-23T00:41:04.727 に答える
-1

親ビューは、サブビューを追加したときに、それ自体をサブビューのスーパービューに設定しましたか?そうでなければ、サブビューはそのスーパービューが誰であるかを知りません。

物事に名前を付けるより標準的な方法は、スーパービューの代わりにデリゲートをメソッドハンドラーに呼び出し、それをプロパティにし、サブビューで、設定されているデリゲートの存在と、メソッドを処理できるかどうかの両方をチェックするようにします。

于 2010-09-22T15:34:42.837 に答える
-1

これは、iPhoneに委任パターンを適用する方法の非常に良い例です。私はコードをダウンロードしました、そしてそれはかなりうまくいきます。

http://www.hivestudio.cat/index.php?option=com_content&view=article&id=57:technical-note-the-delegation-pattern-on-the-iphone&catid=35:technical-note-category&Itemid=76

于 2010-11-26T13:51:49.930 に答える