10

在视图上附加和删除 UIGestureRecognizer 的正确方法是什么?

我通常在-viewDidLoad. 我应该removeGestureRecognizer在 中使用-viewDidUnload吗?还是它们会自动删除?

例如,创建 UIGestureRecognizer 属性并在 viewController 的 init 方法中对其进行初始化,然后在-viewDidAppear/中附加/删除此 gestureRecognizer 属性是更好的方法-viewDidDisappear吗?

(注意我使用的是 ARC)

谢谢。

4

3 回答 3

10

本质上,您可以在有意义的情况下创建、添加和删除手势识别器。并且“何时有意义”取决于一些事情,但通常仅取决于您是否将它们保留为 ivars。关键ARC是管理强引用;默认情况下,使用ARCivars 很强大。

因此,假设您添加了一个水龙头识别器。在这种情况下,您不需要再次访问识别器。我会这样创建它:

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

在这种情况下,您无需执行任何其他操作来管理此识别器。视图系统对它有很强的参考。你所做的就是坐等它来电handleTap:。当视图卸载时,这个点击识别器将被释放。

这种情况也不适合添加此识别器,viewWillAppear:因为不难想象会导致创建多个识别器的一系列事件。

因此,从逻辑上讲,如果您想在外观方法中添加识别器,则必须在 ivar 中对它们进行某种引用。但同样,这并不总是一个坏主意。通常,您希望引用识别器的原因是帮助<UIGestureRecognizerDelegate>方法的逻辑(如果使用它们)。

我个人以后永远不会在initWith..附件方法中添加识别器。唯一的优点是您在那里创建的任何识别器都将保留在视图控制器的整个生命周期中。但是,由于识别器显然是视图系统的一部分,所以这种混淆了MVCCocoa 的优势。同样在内存不足的情况下,导航堆栈上的控制器视图会被清除,但在这种情况下,识别器可能会无缘无故地继续使用内存(不是存在巨大的对象)。

您当然可以在方法中添加识别view(Will/Did)Appear:器,然后在view(Will/Did)Disappear:. 不是我的偏好。我不认为仅仅因为一个modal视图被呈现和删除或者导航push/pop已经发生,我应该删除并重新添加我的识别器。

我建议几乎总是使用viewDidLoad来实例化和附加你的识别器。只要记住消除对它们的任何强引用,viewDidUnload以帮助解决内存不足的情况。再一次,ARC在 dealloc 中不需要对 ivars 做任何事情。

于 2012-04-15T17:57:54.550 回答
0

viewDidUnload仅在内存不足的情况下被调用,并且根本不保证被调用。因此,在 中删除的任何手势识别器viewDidUnload也应在 中删除dealloc。您提到的任何一种方法都可以。

于 2012-04-11T10:52:17.193 回答
0

好吧viewWillAppear:AnimatedviewWillDisappear:animated据我所知,这将是用手势做任何事情的最佳选择。

于 2012-04-11T11:04:55.830 回答