Правильный способ подключения / удаления UIGestureRecognizers

Каков правильный способ прикрепления и удаления UIGestureRecognizer в представлении?

Обычно я создаю и прикрепляю UIGestureReconizers в -viewDidLoad . Должен ли я использовать removeGestureRecognizer в -viewDidUnload ? Или они автоматически удаляются?

Например, это лучший способ создать свойство UIGestureRecognizer и инициализировать его в методе initController init, а затем прикрепить / удалить это свойство -viewDidAppear в -viewDidAppear / -viewDidDisappear ?

(Примечание Я использую ARC)

Благодарю.

По сути, вы можете создавать, добавлять и удалять распознаватели жестов, когда это имеет смысл. И «когда это имеет смысл» варьируется в зависимости от нескольких вещей, но обычно только от того, сохраните ли вы их как иваров. С ARC ключ управляет сильными ссылками; По умолчанию ARC ivars являются сильными.

Итак, скажем, вы добавляете распознаватель крана. В этом случае вам не нужно снова обращаться к распознавателю. Я бы создал его так:

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

В этом случае вам не нужно ничего другого, чтобы управлять этим распознавателем. Система взглядов держит на ней сильную ссылку. Все, что вы делаете, это сидеть сложа handleTap: и ждать, пока он вызовет handleTap: . Когда выгрузите представление, этот распознаватель будет отменен.

Этот сценарий также не был бы хорошим дополнением к этому распознавателю в viewWillAppear: поскольку нетрудно представить серию событий, которые приведут к созданию нескольких распознавателей.

Так логично, если вы хотите добавить распознаватель в методы внешнего вида, вам нужно будет провести некоторую ссылку на них в ivar. Но опять же это не всегда плохая идея. Как правило, причиной, по которой вам нужна ссылка на ваши распознаватели, является помощь в логике методов <UIGestureRecognizerDelegate> , если они используются.

Я лично никогда не добавлю распознаватель в метод initWith.. для вложения позже. Единственное преимущество заключается в том, что любой распознаватель, созданный там, будет храниться в течение всего срока действия контроллера вида. Но так как распознаватель довольно явно является частью системы представлений, этот вид muddies-up MVC что Cocoa является большим. Также в режиме низкой памяти состояние контроллеров в стеке навигации очищается, но в этом случае распознаватель может по-прежнему использовать память (а не огромные объекты) по какой-либо причине.

Вы, конечно, можете добавить распознаватель в view(Will/Did)Appear: метод и удалить его в view(Will/Did)Disappear: Не мое предпочтение. Я не думаю, что только потому, что modal вид представлен и удален, или произошло push / pop навигации, что я должен удалить и снова добавить мои распознаватели.

Я бы рекомендовал почти всегда использовать viewDidLoad для создания экземпляров и прикрепления ваших распознавателей. Просто помните, чтобы viewDidUnload любые сильные ссылки на них в viewDidUnload чтобы помочь в ситуации с низкой памятью. И снова с ARC нет необходимости ничего делать с ivars в dealloc.

viewDidUnload вызывается только в условиях низкой памяти и не может быть вызван вообще. Поэтому любые распознаватели жестов, удаленные в viewDidUnload также должны быть удалены в dealloc . EI другой метод, о котором вы говорите, в порядке.

ok, тогда viewWillAppear:Animated и viewWillDisappear:animated будет лучшим выбором, чтобы делать что-либо с жестами, насколько мне известно.

  • Необходимо применить UIRotationGestureRecognizer, за которым следует UILongPressGestureRecongnizer
  • Добавление примечания на касание с помощью MapKit и UIGestureRecognizer
  • Как получить штрихи на UICollectionView в пустое пространство вокруг всех ячеек
  • UIGestureRecognizer блокирует subview для обработки событий касания
  • ios распознаватель жестов для всех типов
  • Добавить TapGestureRecognizer для всего представления, кроме ячеек UICollectionView
  • Swift UIGestureRecogniser следует пальцем
  • Найти тег отправителя с распознавателем жестов и быстрым
  • UITapGestureRecognizer запускается только для начальной области UIScrollView
  • О программе UIRotationGestureRecognizer
  • Перехват жестов жесты над прокруткой прокрутки UIScrollView
  • Давайте будем гением компьютера.