正确的附加/删除UIGestureRecognizers的方法

mrd*_*650 10 uigesturerecognizer ios

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

我通常创建并附加UIGestureReconizers -viewDidLoad.我要用removeGestureRecognizer-viewDidUnload?或者它们会自动删除吗?

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

(注意我正在使用ARC)

谢谢.

NJo*_*nes 10

基本上,您可以在有意义的时候创建,添加和删除手势识别器.而"当它有意义"取决于一些事情,但通常只是你是否将它们保持为ivars.随着ARC关键是管理强引用; 随着ARC高德在默认情况下强.

所以我们假设您添加了一个水龙头识别器.在这种情况下,您无需再次访问识别器.我会像这样创建它:

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

在这种情况下,您无需其他任何操作来管理此识别器.视图系统正在强烈引用它.你所做的只是坐下来等待它打电话handleTap:.当视图卸载时,此分接识别器将被解除分配.

添加此识别器也不是一个好方法,viewWillAppear:因为不难想象会导致创建多个识别器的一系列事件.

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

我个人永远不会在initWith..以后的附件方法中添加识别器.唯一的优点是,您在那里创建的任何识别器都将保持在视图控制器的整个生命周期中.但是因为识别器显然是视图系统的一部分,所以这种混乱也是MVC可可的重要组成部分.同样在低内存条件下,导航堆栈上的控制器视图被清除,但在这种情况下,识别器可能仍然使用内存(而不是那些巨大的对象),没有任何实际原因.

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

我建议几乎总是viewDidLoad用来实例化和附加你的识别器.只记得在任何对它们的强烈引用中都没有viewDidUnload用来帮助处理内存不足的情况.再一次,ARC在dealloc中没有必要对ivars做任何事情.