2016-12-06 1 views
0

Мне нужно иметь возможность обнаруживать любую активность (т. Е. Не простаивать), чтобы я мог сбросить таймер обратного отсчета.Как я могу обнаружить активность пользователя со всеми представлениями в UINavigationController и элементами управления навигационного контроллера?

Я пробовал идти по маршруту UIWindow sendEvent, но это вызывает слишком много побочных эффектов. Разве нет простого способа определить, что точка зрения нажата, нажата кнопка, пользователь переходит к следующему экрану и т. Д. И т. Д.? Мне не нужно обрабатывать событие или что-то еще, мне просто нужно сбросить таймер, если пользователь все еще использует навигационный контроллер. Btw, этот особенно контроллер навигации представлен другим UIViewController в коде.

Я попытался использовать UIGestureRecognizer для его обработки, но, к сожалению, этот метод, похоже, не обрабатывает элементы управления UINavigationController (например, следующая кнопка, назад и т. Д.).

+0

Возможный дубликат [Xcode & Swift - обнаружение пользовательского интерфейса UIView внутри UISc rollView] (http://stackoverflow.com/questions/25061732/xcode-swift-detecting-user-touch-of-uiview-inside-of-uiscrollview) –

+0

Я обновил свой вопрос. На странице, которую вы опубликовали, похоже, не помогает с UINavigationControllers. – u84six

ответ

0

Вы можете использовать собственный UIWindow подкласс для этой цели и отслеживать активность пользователей на одном из нескольких UIResponder методов:

Любые родительский вид может отслеживать события сенсорных событий. Например, вы можете встроить свой UINavigationController в контроллер отслеживания родительского представления.

Или даже место NonTouchableView на экране Вашего мобильного путем добавления к окну:

[self.view.window addSubview:myNonTouchableView]; 

Вот пример неприкасаемой зрения, которая может отслеживать события прикосновения вхождений:

@interface NonTouchableView : UIView 

@property (weak, nonatomic) id delegate; 

@end 

@implementation NonTouchableView 

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { 
    // Report user activity to self.delegate 
    return nil; 
} 

@end 

Swift версия:

class NonTouchableView : UIView { 

weak var delegate: Object? 

func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { 
    // Report user activity to delegate 
    return nil 
} 

} 
+0

Я бы сделал это в Свифт? Проблема с этим подходом заключается в том, что я не знаю, какой контроллер представления отправляет событие. Поэтому в моем специальном случае у меня есть экран пароля, который представлен одним и тем же навигационным контроллером, и когда я использую экран пароля, запускается hitTest, и я не хочу сбросить таймер, если он используется для экрана пароля. – u84six

+0

Вы должны динамически добавлять и удалять 'NonTouchableView' в' viewDidAppear' и 'viewDidDisappear' различных контроллеров представления, которые вы хотите отслеживать. Вы можете написать этот код один раз в общем контроллере родительского представления ('TrackableViewController'). Или реализовать более сложную логику добавления и удаления этих представлений отслеживания в иерархию. – k06a

+0

Есть ли способ, которым я могу это сделать без подкласса UINavigationController? Причина, по которой я спрашиваю, заключается в том, что UINavigationController находится в рамках, к которым у меня нет доступа. Все, что я делаю, представляет его, и он собирает и возвращает данные. – u84six

Смежные вопросы