2012-04-11 112 views
10

在視圖上連接和移除UIGestureRecognizer的正確方法是什麼?正確連接/移除UIGestureRecognizer的方法

我通常在-viewDidLoad中創建並附加UIGestureReconizers。我是否可以在-viewDidUnload中使用removeGestureRecognizer?或者它們是否被自動刪除?

例如是一個更好的方式來創建一個UIGestureRecognizer屬性,並將其在的viewController的init方法初始化,然後安裝/刪除-viewDidAppear/-viewDidDisappear此gestureRecognizer財產?

(注意我使用ARC)

謝謝。

+0

我已經瀏覽過,但沒有找到我的問題的答案。 – mrd3650 2012-04-11 11:01:22

+0

@TheLion:「對不起,找不到那個頁面。」 – Colas 2015-05-03 14:26:40

+0

對不起蘋果已經改變了它[這裏](https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/GestureRecognizer_basics/GestureRecognizer_basics.html)它是同一資源的新網址。謝謝指出@Colas – 2015-05-14 09:31:53

回答

10

基本上,您可以在有意義時創建,添加和移除手勢識別器。而「何時有意義」取決於一些事情,但通常只是關於你是否將他們保留爲Ivars。與ARC關鍵是管理強大的參考;有ARC ivars默認情況下很強大。

因此,我們假設您添加了一個水龍頭識別器。在這種情況下,您不需要再次訪問識別器。謹以此創建:

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

有了這個方案,需要別的什麼也不做來管理這個識別器。這個觀點系統對它有很強的參考。你所要做的就是坐下來等待它的電話號碼handleTap:。當視圖卸載時,此抽頭識別器將被釋放。

由於不難想象會導致創建多個識別器的一系列事件,所以此場景也不太適合在viewWillAppear:中添加此識別器。

因此,從邏輯上講,如果你想在外觀方法中添加一個識別器,你將不得不在伊娃中持有某種引用。但是,這並不總是一個壞主意。一般來說,您希望參考您的識別器的原因是爲了幫助<UIGestureRecognizerDelegate>方法的邏輯(如果使用的話)。

我個人絕不會在initWith..方法中添加識別器以便以後進行附件。唯一的優點是你在那裏創建的任何識別器都會被保留在視圖控制器的整個生命週期中。但是,由於識別器很明顯是視圖系統的一部分,所以這種混亂 - 可可重點在於MVC。同樣在內存不足的情況下,導航堆棧上的控制器視圖被清除,但在這種情況下,識別器可能仍然使用內存(並非那些巨大的對象),這並不是真正的原因。

您當然可以在view(Will/Did)Appear:方法中添加識別器,並在view(Will/Did)Disappear:中將其刪除。不是我的偏好。我不認爲這只是因爲modal視圖被呈現和刪除,或導航push/pop發生了,我應該刪除並重新添加我的識別器。

我會推薦幾乎總是使用viewDidLoad實例化並附加您的識別器。請記住在viewDidUnload中剔除對它們的強烈引用,以幫助解決低內存情況。再次與ARC有沒有必要在dealloc中與ivars做任何事情。

+0

感謝NJones的詳細答案!在視圖(將/執行)加載和卸載中附加/分離識別器的原因純粹是出於內存原因(因此,當視圖不在屏幕上時,內存將在屏幕上釋放並分配),但是從您說的,這並沒有太大區別。 – mrd3650 2012-04-16 10:53:04

0

viewDidUnload僅在低內存條件下被調用,並且不保證被調用。因此,在viewDidUnload中刪除的任何手勢識別器也應在dealloc中刪除。你提到的其他方法很好。

0

確定然後viewWillAppear:AnimatedviewWillDisappear:animated將是做手勢的任何事情的最佳選擇,就我的知識而言。