在视图上附加和删除UIGestureRecognizer的正确方法是什么?
我通常在-viewDidLoad
中创建并附加UIGestureReconizers。我应该在removeGestureRecognizer
中使用-viewDidUnload
吗?或者他们会被自动删除?
例如,它是创建UIGestureRecognizer属性并在viewController的init方法中初始化它然后在-viewDidAppear
/ -viewDidDisappear
中附加/删除此gestureRecognizer属性的更好方法吗?
(注意我正在使用ARC)
感谢。
答案 0 :(得分:10)
基本上,您可以在有意义的时候创建,添加和删除手势识别器。而“当它有意义”取决于一些事情,但通常只是你是否将它们保持为ivars。使用ARC
,关键是管理强引用;使用ARC
ivars默认为强。
所以我们假设您添加了一个点击识别器。在这种情况下,您无需再次访问识别器。我会像这样创建它:
-(void)viewDidLoad{
[super viewDidLoad];
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
[self.view addGestureRecognizer:tap];
}
使用此方案,您无需执行任何其他操作来管理此识别器。视图系统正在强烈引用它。你所做的就是坐下来等待它呼叫handleTap:
。当视图卸载时,此分接识别器将被解除分配。
在viewWillAppear:
中添加此识别器也不是一个好方法,因为不难想象会导致创建多个识别器的一系列事件。
所以从逻辑上讲,如果你想在外观方法中添加识别器,你必须在ivar中对它们进行某种引用。但同样,这并不总是一个坏主意。通常,您希望引用识别器的原因是为了帮助使用<UIGestureRecognizerDelegate>
方法的逻辑(如果使用它们)。
我个人绝不会在initWith..
方法中添加识别器以便稍后进行附件。唯一的优点是,您在那里创建的任何识别器都将保持在视图控制器的整个生命周期中。但是因为识别器显然是视图系统的一部分,所以这种混乱使得Cocoa很重要MVC
。同样在低内存条件下,导航堆栈上的控制器视图被清除,但在这种情况下,识别器可能仍然使用内存(而不是那些巨大的对象)。
您当然可以在view(Will/Did)Appear:
方法中添加识别器并在view(Will/Did)Disappear:
中将其删除。不是我的偏好。我认为这不仅仅是因为modal
视图已被显示和删除,或导航push
/ pop
已经发生,我应该删除并重新添加我的识别器。
我建议几乎总是使用viewDidLoad
来实例化和附加识别器。请记住在viewDidUnload
中删除对它们的任何强引用,以帮助处理内存不足的情况。再次使用ARC
,无需对dealloc中的ivars做任何事情。
答案 1 :(得分:0)
viewDidUnload
仅在内存不足的情况下被调用,并且不能保证完全被调用。因此,viewDidUnload
中删除的任何手势识别器也应在dealloc
中删除。你提到的其他方法很好。
答案 2 :(得分:0)
好吧那么viewWillAppear:Animated
和viewWillDisappear:animated
将是我所知道做手势的最佳选择。