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

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

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

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

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

Благодарю.

3 Solutions collect form web for “Правильный способ подключения / удаления UIGestureRecognizers”

По сути, вы можете создавать, добавлять и удалять распознаватели жестов, когда это имеет смысл. И «когда это имеет смысл» варьируется в зависимости от нескольких вещей, но обычно только от того, сохраните ли вы их как иваров. С 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 будет лучшим выбором, чтобы делать что-либо с жестами, насколько мне известно.

  • Что на самом деле происходит при вызове setCancelsTouchesInView?
  • UIPanGestureRecognizer - только вертикальный или горизонтальный
  • Использовать UIScreenEdgePanGestureRecognizer без перемещения MKMapView
  • Изменены ли границы uiview, когда на нем используется жест щепотки?
  • UILongPressGestureRecognizer не работает
  • IOS swift Как я могу получить текст меток внутри TableView на метке
  • UITapGestureRecognizer запускается только для начальной области UIScrollView
  • Проблемы с распознавателем жестов в iOS 7
  • UIGestureRecognizer - получить ссылку на затронутый UIViewController вместо его просмотра?
  • Предел UITableView панорамирования до 1 палец
  • Запретить UIPanGestureRecognizer UIScrollView блокировать UIScreenEdgePanGestureRecognizer
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.