10

ビューにUIGestureRecognizerをアタッチおよび削除する正しい方法は何ですか?

私は通常、でUIGestureReconizersを作成して添付し-viewDidLoadます。で使用removeGestureRecognizer-viewDidUnloadますか?それとも自動的に削除されますか?

たとえば、UIGestureRecognizerプロパティを作成し、viewControllerのinitメソッドで初期化してから、このgestureRecognizerプロパティを-viewDidAppear/でアタッチ/削除する方が良い方法-viewDidDisappearですか?

(私はARCを使用していることに注意してください)

ありがとう。

4

3 に答える 3

10

基本的に、必要に応じてジェスチャ レコグナイザーを作成、追加、および削除できます。そして、「それが理にかなっている場合」は、いくつかのことによって異なりますが、通常は、それらを ivar として保持するかどうかによって異なります。ARC重要なのは、強い参照を管理することです。with ARCivar はデフォルトで強力です。

では、タップ認識エンジンを追加するとしましょう。このシナリオでは、認識エンジンに再度アクセスする必要はありません。私は次のように作成します:

-(void)viewDidLoad{
    [super viewDidLoad];
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
    [self.view addGestureRecognizer:tap];
}

このシナリオでは、このレコグナイザーを管理するために他に何もする必要はありません。ビューシステムはそれを強く参照しています。あなたがすることは、座って電話がかかるのを待つことだけですhandleTap:。ビューがアンロードされると、このタップ認識エンジンの割り当てが解除されます。

viewWillAppear:このシナリオは、複数のレコグナイザーの作成につながる一連のイベントを想像するのは難しくないため、このレコグナイザーを追加するのにも適していません。

したがって、論理的には、アピアランス メソッドにレコグナイザーを追加する場合は、ivar でそれらへの何らかの参照を保持する必要があります。しかし、これも必ずしも悪い考えではありません。一般に、レコグナイザーへの参照が必要な理由は、<UIGestureRecognizerDelegate>メソッドが使用されている場合にメソッドのロジックを支援するためです。

initWith..個人的には、後で添付するメソッドに認識エンジンを追加することは決してありません。唯一の利点は、そこで作成したレコグナイザーは、View Controller の全期間にわたって保持されることです。しかし、レコグナイザーはかなり明確にビュー システムの一部であるため、この種の混乱MVCは Cocoa が得意とするところです。また、メモリ不足の状態では、ナビゲーション スタック上のコントローラのビューが削除されますが、この場合、レコグナイザーは実際の理由もなく (巨大なオブジェクトではなく) メモリを使用し続ける可能性があります。

view(Will/Did)Appear:メソッドにレコグナイザーを追加し、 view(Will/Did)Disappear:. 私の好みではありません。ビューが表示されて削除された、またはmodalナビゲーションが発生したという理由だけで、レコグナイザーを削除して再度追加する必要があるとは思いません。pushpop

viewDidLoadレコグナイザーをインスタンス化してアタッチするために、ほぼ常に を使用することをお勧めします。viewDidUnloadメモリ不足の状況で役立つように、それらへの強い参照を無効にすることを忘れないでください。またARC、dealloc で ivar を使用する必要はありません。

于 2012-04-15T17:57:54.550 に答える
0

私の知る限り、ジェスチャを使って何かをするのに最適な選択ですviewWillAppear:AnimatedviewWillDisappear:animated

于 2012-04-11T11:04:55.830 に答える
0

viewDidUnloadメモリ不足の状態でのみ呼び出され、まったく呼び出されることは保証されていません。したがって、 で削除されたジェスチャ レコグナイザは、 でも削除するviewDidUnload必要がありますdealloc。あなたが言及するいずれかの方法は問題ありません。

于 2012-04-11T10:52:17.193 に答える