0

私は初心者の ios プログラマーで、これが私の最初のプロジェクトです。このプロジェクトは、特に ipad 用に開発する予定です。このプロジェクトでは、いくつかの円を描画し、xml 要素を解析してその上にデータを表示する必要があります。loadview メソッドを介して UIViewcontroller に UIView サブクラスをロードします。

  • 円をタッチして、別の UIViewcontroller に切り替えます。

すべての描画とタッチ検出コードが UIView サブクラスにあるため、別の UIViewcontroller に切り替える方法がわかりません。

助けていただければ幸いです

4

4 に答える 4

1

デリゲート メソッドを使用して、タッチがあったことを親ビュー コントローラーに伝える必要があるため、別のビュー コントローラーを表示できます。

サブクラス ヘッダーの先頭にUIView、次を追加します。

@protocol MyCustomViewDelegate <NSObject>

- (void)customViewCircleTapped;

@end

次に、ビューの宣言 (カスタム ビュー サブクラスの既存の宣言) で:

@interface MyCustomView : UIView

...

@property (weak) id<MyCustomViewDelegate> delegate;

その後、View Controller で、view.delegate = selfビューが View Controller を参照できるように を設定する必要があります。

次に、View Controller ヘッダーで、宣言を次のように変更します。

@interface MyViewController : UIViewController <MyCustomViewDelegate>

次にcustomViewCircleTapped、View Controller 実装で実装します。

- (void)customViewCircleTapped {
    ... // Open a view controller or something
}

それが完了したら、ビューのタッチ検出コードに次を追加できます。

[self.delegate customViewCircleTapped];

これが何をするかというと、このメソッドを呼び出して (データを渡す必要がある場合は変更して引数を追加することができます)、ビュー コントローラーが別のビューを開くことができるようにすることで、カスタム ビューに何かが発生したことをその親ビュー コントローラーに通知する機能を与えることです。コントローラーまたはこれに基づいて何らかのアクションを実行します。

ビューがタッチを検出→タッチを処理customViewCircleTapped→ビューコントローラーでデリゲートメソッドを呼び出す→ビューコントローラーが別のビューコントローラーを開く

于 2013-05-21T06:05:46.607 に答える
0

私がこれを行うのが好きな方法は、メッセージをレスポンダ チェーンに送信することです。これにより、ビューがそれを囲むビューおよびビュー コントローラーから完全に切り離されます。そのため、サークル ビューがタップされると、レスポンダー チェーンに「サークル ビューがタップされました」というメッセージが送信されます。そのメッセージに応答するレスポンダー チェーンの最初のオブジェクト (どちらのメッセージかはわかりません/気にしません)。それは呼び出しました。実装は簡単です。

アクションとしてUITapGestureRecognizer をビューにアタッチします-tapped:

ビューでは、タップ アクションは次のようになります。

-(IBAction)tapped:(UIGestureRecognizer*)g
{
    [ self sendAction:@selector( circleViewTapped: ) withObject:self ] ;
}

-sendAction:UIResponderのメソッドは、次のようにカテゴリを介して追加されます。

@implementation UIResponder (ActionSending)

-(void)sendAction:(SEL)action withObect:(id)object
{
    UIResponder * target = self ;
    while( self && ![ target respondsToSelector:action ] )
    {
        target = [ target nextResponder ] ;
    }

    [ target performSelector:action withObject:object ] ;
}

@end

View Controller、または応答する親ビューまたは親View ControllerはcircleViewTapped:、サークルビューがタップされたときにそのメソッドが呼び出されます。

ビューの編成に関する注意:

サークル ビューの UIView サブクラスを作成します。表示する円ごとにサブクラスをインスタンス化します。それぞれに UITapGestureRecognizer をアタッチします。ジェスチャ認識エンジンのターゲットは-tapped:、上記のメソッドです。

于 2013-05-21T06:28:07.080 に答える
0

現在の回答は、ソリューションを過度に複雑にしています。ジェスチャ レコグナイザーやデリゲート プロトコルは必要ありません。

円の描画ビューを UIView ではなく UIControl のサブクラスにします。次に、View Controller をターゲットとしてUIControlEventTouchUpInsideイベントにアタッチします。

[circleView addTarget:self action:@selector(circleTapped:) forControlEvents:UIControlEventTouchUpInside];

circleTapped:これにより、タップされたビューを送信者として、View Controllerのメソッドが呼び出されます。

于 2013-05-21T06:54:41.687 に答える